From 900a4b5264699c0c317c56419b99c8cecb0685ce Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:41:49 -0400 Subject: [PATCH 01/99] chore: test archive --- components/chainhook-cli/src/config/generator.rs | 2 +- components/chainhook-cli/src/config/mod.rs | 7 ++++++- tests/Chainhook.toml | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 074bc328f..90e61ba65 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -37,7 +37,7 @@ max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 [[event_source]] -tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" +tsv_file_url = "https://archive.dev.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" "#, network = network.to_lowercase(), ); diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 039ff97fb..90be18798 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -12,10 +12,15 @@ use std::io::{BufReader, Read}; use std::path::PathBuf; const DEFAULT_MAINNET_STACKS_TSV_ARCHIVE: &str = - "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest"; + "https://archive.dev.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest"; const DEFAULT_TESTNET_STACKS_TSV_ARCHIVE: &str = +<<<<<<< HEAD "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; pub const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; +======= + "https://archive.dev.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; +const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; +>>>>>>> 1b5b2cb (chore: test archive) pub const DEFAULT_INGESTION_PORT: u16 = 20455; pub const DEFAULT_CONTROL_PORT: u16 = 20456; diff --git a/tests/Chainhook.toml b/tests/Chainhook.toml index 79e6b8f69..a257f7c27 100644 --- a/tests/Chainhook.toml +++ b/tests/Chainhook.toml @@ -26,4 +26,4 @@ max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 [[event_source]] -tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" +tsv_file_url = "https://archive.dev.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" From c352a46182709f317cc6af0277430b9a594a203d Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Fri, 21 Jul 2023 11:15:46 -0400 Subject: [PATCH 02/99] chore: add automated test --- automate/.env | 1 + automate/.gitignore | 20 ++ automate/package-lock.json | 234 ++++++++++++++++++ automate/package.json | 24 ++ automate/readme.md | 48 ++++ automate/script/index.ts | 25 ++ .../block-height/block-height-file.json | 21 ++ .../block-height-file.result.json | 0 .../block-height/block-height-post.json | 1 + .../contract-call/contract-call-file.json | 22 ++ .../contract-call-file.result.json | 0 .../contract-call/contract-call-post.json | 1 + .../contract-deployment-file.json | 21 ++ .../contract-deployment-file.result.json | 0 .../contract-deployment-post.json | 1 + .../ft-event/ft-event-file.json | 22 ++ .../ft-event/ft-event-file.result.json | 0 .../ft-event/ft-event-post.json | 1 + automate/script/stacks-predicates/index.ts | 227 +++++++++++++++++ .../nft-event/nft-event-file.json | 22 ++ .../nft-event/nft-event-file.result.json | 0 .../nft-event/nft-event-post.json | 1 + .../stacks-predicates/predicate-commands.json | 42 ++++ .../print-event/print-event-file.json | 22 ++ .../print-event/print-event-file.result.json | 0 .../print-event/print-event-post.json | 1 + .../stx-event/stx-event-file.json | 21 ++ .../stx-event/stx-event-file.result.json | 0 .../stx-event/stx-event-post.json | 1 + .../transaction/transaction-file.json | 21 ++ .../transaction/transaction-file.result.json | 0 .../transaction/transaction-post.json | 1 + automate/script/utils/helper.ts | 36 +++ automate/tsconfig.json | 14 ++ .../chainhook-cli/src/config/generator.rs | 2 +- components/chainhook-cli/src/config/mod.rs | 4 +- tests/Chainhook.toml | 2 +- 37 files changed, 855 insertions(+), 4 deletions(-) create mode 100644 automate/.env create mode 100755 automate/.gitignore create mode 100644 automate/package-lock.json create mode 100755 automate/package.json create mode 100755 automate/readme.md create mode 100755 automate/script/index.ts create mode 100644 automate/script/stacks-predicates/block-height/block-height-file.json create mode 100644 automate/script/stacks-predicates/block-height/block-height-file.result.json create mode 100644 automate/script/stacks-predicates/block-height/block-height-post.json create mode 100644 automate/script/stacks-predicates/contract-call/contract-call-file.json create mode 100644 automate/script/stacks-predicates/contract-call/contract-call-file.result.json create mode 100644 automate/script/stacks-predicates/contract-call/contract-call-post.json create mode 100644 automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json create mode 100644 automate/script/stacks-predicates/contract-deployment/contract-deployment-file.result.json create mode 100644 automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json create mode 100644 automate/script/stacks-predicates/ft-event/ft-event-file.json create mode 100644 automate/script/stacks-predicates/ft-event/ft-event-file.result.json create mode 100644 automate/script/stacks-predicates/ft-event/ft-event-post.json create mode 100644 automate/script/stacks-predicates/index.ts create mode 100644 automate/script/stacks-predicates/nft-event/nft-event-file.json create mode 100644 automate/script/stacks-predicates/nft-event/nft-event-file.result.json create mode 100644 automate/script/stacks-predicates/nft-event/nft-event-post.json create mode 100644 automate/script/stacks-predicates/predicate-commands.json create mode 100644 automate/script/stacks-predicates/print-event/print-event-file.json create mode 100644 automate/script/stacks-predicates/print-event/print-event-file.result.json create mode 100644 automate/script/stacks-predicates/print-event/print-event-post.json create mode 100644 automate/script/stacks-predicates/stx-event/stx-event-file.json create mode 100644 automate/script/stacks-predicates/stx-event/stx-event-file.result.json create mode 100644 automate/script/stacks-predicates/stx-event/stx-event-post.json create mode 100644 automate/script/stacks-predicates/transaction/transaction-file.json create mode 100644 automate/script/stacks-predicates/transaction/transaction-file.result.json create mode 100644 automate/script/stacks-predicates/transaction/transaction-post.json create mode 100755 automate/script/utils/helper.ts create mode 100755 automate/tsconfig.json diff --git a/automate/.env b/automate/.env new file mode 100644 index 000000000..9a6686347 --- /dev/null +++ b/automate/.env @@ -0,0 +1 @@ +DOMAIN_URL="https://webhook.site/db639532-0288-44e3-9add-1584af436d6d" \ No newline at end of file diff --git a/automate/.gitignore b/automate/.gitignore new file mode 100755 index 000000000..1327e1ab4 --- /dev/null +++ b/automate/.gitignore @@ -0,0 +1,20 @@ +dist/ +node_modules/ +example/node_modules +example/dist +tests/screenshots/* +.next +.idea +.DS_Store +.vercel +yarn-error.log +stacks-wallet-chromium.zip +packages +web-ext-artifacts/ +.yalc/ +yalc.lock +coverage +.jest-cache +release_body.md +metamask-extension/chrome/* +cache diff --git a/automate/package-lock.json b/automate/package-lock.json new file mode 100644 index 000000000..48abea843 --- /dev/null +++ b/automate/package-lock.json @@ -0,0 +1,234 @@ +{ + "name": "custom_stacks_application", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "custom_stacks_application", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^16.0.3" + }, + "devDependencies": { + "@types/node": "^18.11.12", + "prettier": "2.8.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + } + }, + "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, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "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 + }, + "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 + }, + "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 + }, + "node_modules/@types/node": { + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "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 + }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "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/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "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 + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/automate/package.json b/automate/package.json new file mode 100755 index 000000000..36e5f1524 --- /dev/null +++ b/automate/package.json @@ -0,0 +1,24 @@ +{ + "name": "custom_stacks_application", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "dotenv": "^16.0.3" + }, + "devDependencies": { + "@types/node": "^18.11.12", + "prettier": "2.8.1", + "ts-node": "^10.9.1", + "typescript": "^4.9.4" + }, + "scripts": { + "predicates": "ts-node ./script/index.ts", + "file-predicates": "ts-node ./script/index.ts file", + "post-predicates": "ts-node ./script/index.ts post", + "clear-result-files": "ts-node ./script/index.ts clear-result-files" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/automate/readme.md b/automate/readme.md new file mode 100755 index 000000000..d0fa73455 --- /dev/null +++ b/automate/readme.md @@ -0,0 +1,48 @@ +# automate-chainhooks +automate-chainhooks is a node script for running the chainhooks predicate. + +### Prerequisites + +- npm installed and Node v16.* +- [ngrok](https://dev.to/ibrarturi/how-to-test-webhooks-on-your-localhost-3b4f) +- [chainhook](https://github.com/hirosystems/chainhook/blob/5791379655fba786abf6e265311c0d789a8722e5/docs/getting-started.md) + +### Run script +1. Go to the root of the project and do `npm install`. Make sure you have satisfied the above Prerequisites. +2. Start ngrok using the command `ngrok http 127.0.0.1:3009`. Once it starts, provide the ngrok URL in the `.env` file for `DOMAIN_URL`. This is required to post the result for the http predicates. You can check the ngrok requests at `localhost:4040` +3. Run all the predicates: + ```sh + $ npm run predicates +4. Run all the file result predicates: + ```sh + $ npm run file-predicates +5. Run all the POST URL predicates: + ```sh + $ npm run post-predicates +6. Clear all the result files: + ```sh + $ npm run clear-result-files +7. Run transaction predicate for file append and POST + ```sh + $ predicate=transaction npm run predicates +8. Run print-event predicate for file append and POST + ```sh + $ predicate=print-event npm run predicates +9. Run nft-event predicate for file append and POST + ```sh + $ predicate=nft-event npm run predicates +10. Run ft-event predicate for file append and POST + ```sh + $ predicate=ft-event npm run predicates +11. Run contract-deployment predicate for file append and POST + ```sh + $ predicate=contract-deployment npm run predicates +12. Run contract-call predicate for file append and POST + ```sh + $ predicate=contract-call npm run predicates +13. Run block-height predicate for file append and POST + ```sh + $ predicate=block-height npm run predicates +14. Run stx-event predicate for file append and POST + ```sh + $ predicate=stx-event npm run predicates \ No newline at end of file diff --git a/automate/script/index.ts b/automate/script/index.ts new file mode 100755 index 000000000..7faa2dca1 --- /dev/null +++ b/automate/script/index.ts @@ -0,0 +1,25 @@ +import { + triggerAllPredicates, + triggerAllFilePredicates, + triggerAllPOSTPredicates, +} from "./stacks-predicates"; +import { initDomainAPI, clearResultFiles } from "./utils/helper"; +require("dotenv").config({ path: ".env" }); + +const type = process.argv[2]; +if (!type) { + initDomainAPI(); + triggerAllPredicates(); +} + +if (type === "file") { + triggerAllFilePredicates(); +} + +if (type === "post") { + triggerAllPOSTPredicates(); +} + +if (type === "clear-result-files") { + clearResultFiles(); +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/block-height/block-height-file.json b/automate/script/stacks-predicates/block-height/block-height-file.json new file mode 100644 index 000000000..3761cb973 --- /dev/null +++ b/automate/script/stacks-predicates/block-height/block-height-file.json @@ -0,0 +1,21 @@ +{ + "chain": "stacks", + "uuid": "5128f99a-eac7-484f-8228-6e643bd19cf7", + "name": "Block Height File", + "version": 1, + "networks": { + "testnet": { + "start_block": 111785, + "end_block": 111795, + "if_this": { + "scope": "block_height", + "equals": 111790 + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/block-height/block-height-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/block-height/block-height-file.result.json b/automate/script/stacks-predicates/block-height/block-height-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/block-height/block-height-post.json b/automate/script/stacks-predicates/block-height/block-height-post.json new file mode 100644 index 000000000..560cf1146 --- /dev/null +++ b/automate/script/stacks-predicates/block-height/block-height-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"fa95ed2c-6d0b-49eb-90cd-71875122f71d","name":"Block Height Post","version":1,"networks":{"testnet":{"start_block":111785,"end_block":111795,"if_this":{"scope":"block_height","equals":111790},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/contract-call/contract-call-file.json b/automate/script/stacks-predicates/contract-call/contract-call-file.json new file mode 100644 index 000000000..66c3a724e --- /dev/null +++ b/automate/script/stacks-predicates/contract-call/contract-call-file.json @@ -0,0 +1,22 @@ +{ + "chain": "stacks", + "uuid": "0dcfe481-ef9e-40f7-ad7b-1a9a39895516", + "name": "Contract Call File", + "version": 1, + "networks": { + "testnet": { + "start_block": 0, + "end_block": 311800, + "if_this": { + "scope": "contract_call", + "contract_identifier": "ST000000000000000000002AMW42H.bns", + "method": "name-revoke" + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/contract-call/contract-call-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/contract-call/contract-call-file.result.json b/automate/script/stacks-predicates/contract-call/contract-call-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/contract-call/contract-call-post.json b/automate/script/stacks-predicates/contract-call/contract-call-post.json new file mode 100644 index 000000000..60bf64e05 --- /dev/null +++ b/automate/script/stacks-predicates/contract-call/contract-call-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"35ed0323-7549-41ee-a546-ab00d453a681","name":"Contract Call Post","version":1,"networks":{"testnet":{"start_block":0,"end_block":311800,"if_this":{"scope":"contract_call","contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json b/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json new file mode 100644 index 000000000..d912dbd33 --- /dev/null +++ b/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json @@ -0,0 +1,21 @@ +{ + "chain": "stacks", + "uuid": "6cdd033e-3d89-43eb-99eb-97d233afab6b", + "name": "Contract Deployment file", + "version": 1, + "networks": { + "testnet": { + "start_block": 0, + "end_block": 311800, + "if_this": { + "scope": "contract_deployment", + "deployer": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/contract-deployment/contract-deployment-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.result.json b/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json b/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json new file mode 100644 index 000000000..3cbb5ab51 --- /dev/null +++ b/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"8625d9df-a41d-49e9-aece-44280428cc78","name":"Contract Deployment post","version":1,"networks":{"testnet":{"start_block":0,"end_block":311800,"if_this":{"scope":"contract_deployment","deployer":"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/ft-event/ft-event-file.json b/automate/script/stacks-predicates/ft-event/ft-event-file.json new file mode 100644 index 000000000..9b0bb3113 --- /dev/null +++ b/automate/script/stacks-predicates/ft-event/ft-event-file.json @@ -0,0 +1,22 @@ +{ + "chain": "stacks", + "uuid": "a2b55836-5fbe-441b-9de8-c24c3cda286c", + "name": "FT Event File", + "version": 1, + "networks": { + "testnet": { + "start_block": 26000, + "end_block": 26050, + "if_this": { + "scope": "ft_event", + "asset_identifier": "ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty", + "actions": ["transfer"] + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/ft-event/ft-event-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/ft-event/ft-event-file.result.json b/automate/script/stacks-predicates/ft-event/ft-event-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/ft-event/ft-event-post.json b/automate/script/stacks-predicates/ft-event/ft-event-post.json new file mode 100644 index 000000000..add6a1ff2 --- /dev/null +++ b/automate/script/stacks-predicates/ft-event/ft-event-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"1cf16403-be82-4c69-99d7-7083b5a36434","name":"FT Event POST","version":1,"networks":{"testnet":{"start_block":26000,"end_block":26050,"if_this":{"scope":"ft_event","asset_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty","actions":["transfer"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/index.ts b/automate/script/stacks-predicates/index.ts new file mode 100644 index 000000000..d06a28ea3 --- /dev/null +++ b/automate/script/stacks-predicates/index.ts @@ -0,0 +1,227 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "./predicate-commands.json"; + +export const triggerAllPredicates = async () => { + const selectedPredicate = process.env.predicate; + if (!selectedPredicate) { + await triggerTransaction(); + await triggerPrintEvent(); + await triggerNFTEvent(); + await triggerFTEvent(); + await triggerContractDeployment(); + await triggerContractCall(); + await triggerBlockHeight(); + await triggerSTXEvent(); + } + if (selectedPredicate === "transaction") { + await triggerTransaction(); + } + if (selectedPredicate === "print-event") { + await triggerPrintEvent(); + } + if (selectedPredicate === "nft-event") { + await triggerNFTEvent(); + } + if (selectedPredicate === "ft-event") { + await triggerFTEvent(); + } + if (selectedPredicate === "contract-deployment") { + await triggerContractDeployment(); + } + if (selectedPredicate === "contract-call") { + await triggerContractCall(); + } + if (selectedPredicate === "block-height") { + await triggerBlockHeight(); + } + if (selectedPredicate === "stx-event") { + await triggerSTXEvent(); + } +}; + +export const triggerAllFilePredicates = async () => { + await transactionFilePredicate(); + await stxEventFilePredicate(); + await printEventFilePredicate(); + await NFTEventFilePredicate(); + await FTEventFilePredicate(); + await contractDeploymentFilePredicate(); + await contractCallFilePredicate(); + await blockHeightFilePredicate(); +}; + +export const triggerAllPOSTPredicates = async () => { + await transactionPOSTPredicate(); + await stxEventPOSTPredicate(); + await printEventPOSTPredicate(); + await NFTEventPOSTPredicate(); + await FTEventPOSTPredicate(); + await contractDeploymentPOSTPredicate(); + await contractCallPOSTPredicate(); + await blockHeightPOSTPredicate(); +}; + +const triggerTransaction = async (): Promise => { + console.log("EXECUTING predicate for transaction"); + await transactionFilePredicate(); + await transactionPOSTPredicate(); + console.log("COMPLETED predicate for transaction"); +}; + +const triggerSTXEvent = async (): Promise => { + console.log("EXECUTING predicate for STX Event"); + await stxEventFilePredicate(); + await stxEventPOSTPredicate(); + console.log("COMPLETED predicate for STX Event"); +}; + +const triggerPrintEvent = async (): Promise => { + console.log("EXECUTING predicate for print Event"); + await printEventFilePredicate(); + await printEventPOSTPredicate(); + console.log("COMPLETED predicate for print Event"); +}; + +const triggerNFTEvent = async (): Promise => { + console.log("EXECUTING predicate for NFT Event"); + await NFTEventFilePredicate(); + await NFTEventPOSTPredicate(); + console.log("COMPLETED predicate for NFT Event"); +}; + +const triggerFTEvent = async (): Promise => { + console.log("EXECUTING predicate for FT Event"); + await FTEventFilePredicate(); + await FTEventPOSTPredicate(); + console.log("COMPLETED predicate for FT Event"); +}; + +const triggerContractDeployment = async (): Promise => { + console.log("EXECUTING predicate for Contract Deployment"); + await contractDeploymentFilePredicate(); + await contractDeploymentPOSTPredicate(); + console.log("COMPLETED predicate for Contract Deployment"); +}; + +const triggerContractCall = async (): Promise => { + console.log("EXECUTING predicate for Contract Call"); + await contractCallFilePredicate(); + await contractCallPOSTPredicate(); + console.log("COMPLETED predicate for Contract Call"); +}; + +const triggerBlockHeight = async (): Promise => { + console.log("EXECUTING predicate for Block Height"); + await blockHeightFilePredicate(); + await blockHeightPOSTPredicate(); + console.log("COMPLETED predicate for Block Height"); +}; + +const transactionFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.transaction_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.transaction_file.command + ); + console.log(stderr); +}; + +const transactionPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.transaction_post); + console.log(stderr); +}; + +const stxEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.stx_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.stx_event_file.command + ); + console.log(stderr); +}; + +const stxEventPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.stx_event_post); + console.log(stderr); +}; + +const printEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.print_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.print_event_file.command + ); + console.log(stderr); +}; + +const printEventPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.print_event_post); + console.log(stderr); +}; + +const NFTEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.nft_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.nft_event_file.command + ); + console.log(stderr); +}; + +const NFTEventPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.nft_event_post); + console.log(stderr); +}; + +const FTEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.ft_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.ft_event_file.command + ); + console.log(stderr); +}; + +const FTEventPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.ft_event_post); + console.log(stderr); +}; + +const contractDeploymentFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.contract_deployment_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.contract_deployment_file.command + ); + console.log(stderr); +}; + +const contractDeploymentPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec( + predicateCommands.contract_deployment_post + ); + console.log(stderr); +}; + +const contractCallFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.contract_call_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.contract_call_file.command + ); + console.log(stderr); +}; + +const contractCallPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.contract_call_post); + console.log(stderr); +}; + +const blockHeightFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.block_height_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.block_height_file.command + ); + console.log(stderr); +}; + +const blockHeightPOSTPredicate = async (): Promise => { + const { stdout, stderr } = await exec(predicateCommands.block_height_post); + console.log(stderr); +}; diff --git a/automate/script/stacks-predicates/nft-event/nft-event-file.json b/automate/script/stacks-predicates/nft-event/nft-event-file.json new file mode 100644 index 000000000..14f7a5e06 --- /dev/null +++ b/automate/script/stacks-predicates/nft-event/nft-event-file.json @@ -0,0 +1,22 @@ +{ + "chain": "stacks", + "uuid": "c3c3bf08-2035-40bf-a5eb-0e4295911f8a", + "name": "nft event file", + "version": 1, + "networks": { + "testnet": { + "start_block": 0, + "end_block": 411850, + "if_this": { + "scope": "nft_event", + "asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3", + "actions": ["claim"] + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/nft-event/nft-event-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/nft-event/nft-event-file.result.json b/automate/script/stacks-predicates/nft-event/nft-event-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/nft-event/nft-event-post.json b/automate/script/stacks-predicates/nft-event/nft-event-post.json new file mode 100644 index 000000000..c800a823f --- /dev/null +++ b/automate/script/stacks-predicates/nft-event/nft-event-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"fc0eb094-be0f-42b5-b7a6-6100d9c512cb","name":"nft event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":411850,"if_this":{"scope":"nft_event","asset_identifier":"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3","actions":["claim"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/predicate-commands.json b/automate/script/stacks-predicates/predicate-commands.json new file mode 100644 index 000000000..17d6db511 --- /dev/null +++ b/automate/script/stacks-predicates/predicate-commands.json @@ -0,0 +1,42 @@ +{ + "transaction_file": { + "command": "chainhook predicates scan script/stacks-predicates/transaction/transaction-file.json --testnet", + "result_file": "script/stacks-predicates/transaction/transaction-file.result.json" + }, + "transaction_post": "chainhook predicates scan script/stacks-predicates/transaction/transaction-post.json --testnet", + "block_height_file": { + "command": "chainhook predicates scan script/stacks-predicates/block-height/block-height-file.json --testnet", + "result_file": "script/stacks-predicates/block-height/block-height-file.result.json" + }, + "block_height_post": "chainhook predicates scan script/stacks-predicates/block-height/block-height-post.json --testnet", + "ft_event_file": { + "command": "chainhook predicates scan script/stacks-predicates/ft-event/ft-event-file.json --testnet", + "result_file": "script/stacks-predicates/ft-event/ft-event-file.result.json" + }, + "ft_event_post": "chainhook predicates scan script/stacks-predicates/ft-event/ft-event-post.json --testnet", + "nft_event_file": { + "command": "chainhook predicates scan script/stacks-predicates/nft-event/nft-event-file.json --testnet", + "result_file": "script/stacks-predicates/nft-event/nft-event-file.result.json" + }, + "nft_event_post": "chainhook predicates scan script/stacks-predicates/nft-event/nft-event-post.json --testnet", + "stx_event_file": { + "command": "chainhook predicates scan script/stacks-predicates/stx-event/stx-event-file.json --testnet", + "result_file": "script/stacks-predicates/stx-event/stx-event-file.result.json" + }, + "stx_event_post": "chainhook predicates scan script/stacks-predicates/stx-event/stx-event-post.json --testnet", + "print_event_file": { + "command": "chainhook predicates scan script/stacks-predicates/print-event/print-event-file.json --testnet", + "result_file": "script/stacks-predicates/print-event/print-event-file.result.json" + }, + "print_event_post": "chainhook predicates scan script/stacks-predicates/print-event/print-event-post.json --testnet", + "contract_call_file": { + "command": "chainhook predicates scan script/stacks-predicates/contract-call/contract-call-file.json --testnet", + "result_file": "script/stacks-predicates/contract-call/contract-call-file.result.json" + }, + "contract_call_post": "chainhook predicates scan script/stacks-predicates/contract-call/contract-call-post.json --testnet", + "contract_deployment_file": { + "command": "chainhook predicates scan script/stacks-predicates/contract-deployment/contract-deployment-file.json --testnet", + "result_file": "script/stacks-predicates/contract-deployment/contract-deployment-file.result.json" + }, + "contract_deployment_post": "chainhook predicates scan script/stacks-predicates/contract-deployment/contract-deployment-post.json --testnet" +} diff --git a/automate/script/stacks-predicates/print-event/print-event-file.json b/automate/script/stacks-predicates/print-event/print-event-file.json new file mode 100644 index 000000000..f410baa76 --- /dev/null +++ b/automate/script/stacks-predicates/print-event/print-event-file.json @@ -0,0 +1,22 @@ +{ + "chain": "stacks", + "uuid": "375d8569-5342-4e80-9ee9-e6e9bb4bf2a5", + "name": "print event file", + "version": 1, + "networks": { + "testnet": { + "start_block": 0, + "end_block": 511800, + "if_this": { + "scope": "print_event", + "contract_identifier": "ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin", + "contains": "balance-of" + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/print-event/print-event-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/print-event/print-event-file.result.json b/automate/script/stacks-predicates/print-event/print-event-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/print-event/print-event-post.json b/automate/script/stacks-predicates/print-event/print-event-post.json new file mode 100644 index 000000000..76858c765 --- /dev/null +++ b/automate/script/stacks-predicates/print-event/print-event-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"220b8661-6b64-44ea-93e5-db0657212b60","name":"print event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":511800,"if_this":{"scope":"print_event","contract_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin","contains":"balance-of"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/stx-event/stx-event-file.json b/automate/script/stacks-predicates/stx-event/stx-event-file.json new file mode 100644 index 000000000..761053774 --- /dev/null +++ b/automate/script/stacks-predicates/stx-event/stx-event-file.json @@ -0,0 +1,21 @@ +{ + "chain": "stacks", + "uuid": "1950fbed-85b5-467f-b4ac-fc464e18e021", + "name": "Stx event file", + "version": 1, + "networks": { + "testnet": { + "start_block": 111750, + "end_block": 111780, + "if_this": { + "scope": "stx_event", + "actions": ["transfer", "lock"] + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/stx-event/stx-event-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/stx-event/stx-event-file.result.json b/automate/script/stacks-predicates/stx-event/stx-event-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/stx-event/stx-event-post.json b/automate/script/stacks-predicates/stx-event/stx-event-post.json new file mode 100644 index 000000000..c3ffb0553 --- /dev/null +++ b/automate/script/stacks-predicates/stx-event/stx-event-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"0cc86353-7883-4fde-a1e6-42df78f0f6d6","name":"Stx event post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":211800,"if_this":{"scope":"stx_event","actions":["transfer","lock"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/transaction/transaction-file.json b/automate/script/stacks-predicates/transaction/transaction-file.json new file mode 100644 index 000000000..2005adfe5 --- /dev/null +++ b/automate/script/stacks-predicates/transaction/transaction-file.json @@ -0,0 +1,21 @@ +{ + "chain": "stacks", + "uuid": "dad71268-d3c1-4cd9-bb99-16a4bd4155c4", + "name": "transactions file", + "version": 1, + "networks": { + "testnet": { + "start_block": 111750, + "end_block": 111850, + "if_this": { + "scope": "txid", + "equals": "0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b" + }, + "then_that": { + "file_append": { + "path": "script/stacks-predicates/transaction/transaction-file.result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/script/stacks-predicates/transaction/transaction-file.result.json b/automate/script/stacks-predicates/transaction/transaction-file.result.json new file mode 100644 index 000000000..e69de29bb diff --git a/automate/script/stacks-predicates/transaction/transaction-post.json b/automate/script/stacks-predicates/transaction/transaction-post.json new file mode 100644 index 000000000..9b1f5c0c3 --- /dev/null +++ b/automate/script/stacks-predicates/transaction/transaction-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"633ea892-e1e0-4f5a-bba2-63e18a4fc9b9","name":"transactions post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":111850,"if_this":{"scope":"txid","equals":"0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/utils/helper.ts b/automate/script/utils/helper.ts new file mode 100755 index 000000000..83bb35c8d --- /dev/null +++ b/automate/script/utils/helper.ts @@ -0,0 +1,36 @@ +import * as fs from "fs"; +const stacksPostFile = [ + "transaction/transaction", + "block-height/block-height", + "ft-event/ft-event", + "nft-event/nft-event", + "stx-event/stx-event", + "print-event/print-event", + "contract-call/contract-call", + "contract-deployment/contract-deployment" +]; +export const initDomainAPI = async (): Promise => { + initTestnetStacksPOSTURL(); +}; + +const initTestnetStacksPOSTURL = () => { + const domainURL = process.env.DOMAIN_URL; + if (!domainURL) { + console.log("Please set the domain url for POST predicates"); + process.exit(1); + } + + stacksPostFile.map((postFile) => { + const fileContent = JSON.parse( + fs.readFileSync(`script/stacks-predicates/${postFile}-post.json`, "utf8") + ); + fileContent.networks.testnet.then_that.http_post.url = domainURL; + fs.writeFileSync(`script/stacks-predicates/${postFile}-post.json`, JSON.stringify(fileContent)); + }); +}; + +export const clearResultFiles = () => { + stacksPostFile.map((postFile) => { + fs.writeFileSync(`script/stacks-predicates/${postFile}-file.result.json`, ''); + }); +}; diff --git a/automate/tsconfig.json b/automate/tsconfig.json new file mode 100755 index 000000000..aae154da0 --- /dev/null +++ b/automate/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "lib": ["es6"], + "allowJs": true, + "outDir": "build", + "rootDir": "script", + "strict": true, + "noImplicitAny": false, + "esModuleInterop": true, + "resolveJsonModule": true + } +} diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 90e61ba65..074bc328f 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -37,7 +37,7 @@ max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 [[event_source]] -tsv_file_url = "https://archive.dev.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" +tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" "#, network = network.to_lowercase(), ); diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 90be18798..990c6a43f 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -12,13 +12,13 @@ use std::io::{BufReader, Read}; use std::path::PathBuf; const DEFAULT_MAINNET_STACKS_TSV_ARCHIVE: &str = - "https://archive.dev.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest"; + "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest"; const DEFAULT_TESTNET_STACKS_TSV_ARCHIVE: &str = <<<<<<< HEAD "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; pub const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; ======= - "https://archive.dev.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; + "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; >>>>>>> 1b5b2cb (chore: test archive) diff --git a/tests/Chainhook.toml b/tests/Chainhook.toml index a257f7c27..79e6b8f69 100644 --- a/tests/Chainhook.toml +++ b/tests/Chainhook.toml @@ -26,4 +26,4 @@ max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 [[event_source]] -tsv_file_url = "https://archive.dev.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" +tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" From b31c5b039bc142e489d296c2b67e49091818f83f Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:01:50 -0400 Subject: [PATCH 03/99] chore: update --- components/chainhook-cli/src/config/mod.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 990c6a43f..fc27f18c9 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -14,13 +14,10 @@ use std::path::PathBuf; const DEFAULT_MAINNET_STACKS_TSV_ARCHIVE: &str = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest"; const DEFAULT_TESTNET_STACKS_TSV_ARCHIVE: &str = -<<<<<<< HEAD "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; pub const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; -======= "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; ->>>>>>> 1b5b2cb (chore: test archive) pub const DEFAULT_INGESTION_PORT: u16 = 20455; pub const DEFAULT_CONTROL_PORT: u16 = 20456; From 3d1283a26284d86c4d9c453f8318202e6ef86ac4 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:09:47 -0400 Subject: [PATCH 04/99] chore: update chore: update --- components/chainhook-cli/src/config/mod.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index fc27f18c9..039ff97fb 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -16,8 +16,6 @@ const DEFAULT_MAINNET_STACKS_TSV_ARCHIVE: &str = const DEFAULT_TESTNET_STACKS_TSV_ARCHIVE: &str = "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; pub const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; - "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest"; -const DEFAULT_REDIS_URI: &str = "redis://localhost:6379/"; pub const DEFAULT_INGESTION_PORT: u16 = 20455; pub const DEFAULT_CONTROL_PORT: u16 = 20456; From 89acc7fa657654ea86cddc8e6b8db01e909906bc Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:31:29 -0400 Subject: [PATCH 05/99] chore: add assertions --- automate/.env | 2 +- automate/Chainhook.toml | 35 + automate/jest.config.js | 13 + automate/package-lock.json | 26094 +++++++++++++++- automate/package.json | 74 +- automate/playwright.config.js | 6 + automate/readme.md | 15 +- automate/script/index.ts | 25 - .../contract-deployment-post.json | 1 - automate/script/stacks-predicates/index.ts | 227 - .../stacks-predicates/predicate-commands.json | 42 - automate/script/utils/helper.ts | 36 - .../transaction/transaction-post.json | 22 + .../transaction/transaction.spec.ts | 51 + automate/tests/mocks/index.ts | 1 + .../tests/selectors/postPage.selectors.ts | 6 + automate/tests/setup-tests.ts | 53 + .../block-height-file-result.json} | 0 .../block-height/block-height-file.json | 8 +- .../block-height/block-height-post.json | 2 +- .../block-height/block-height.spec.ts | 37 + .../contract-call-file-result.json} | 0 .../contract-call/contract-call-file.json | 23 + .../contract-call/contract-call-post.json | 1 + .../contract-call/contract-call.spec.ts | 57 + .../contract-deployment-file-result.json} | 0 .../contract-deployment-file.json | 9 +- .../contract-deployment-post.json | 1 + .../contract-deployment.spec.ts | 59 + .../ft-event/ft-event-file-result.json} | 0 .../ft-event/ft-event-file.json | 7 +- .../ft-event/ft-event-post.json | 2 +- .../ft-event/ft-event.spec.ts | 37 + .../nft-event/nft-event-file-result.json} | 0 .../nft-event/nft-event-file.json | 6 +- .../nft-event/nft-event-post.json | 2 +- .../nft-event/nft-event.spec.ts | 37 + .../stacks-predicates/predicate-commands.json | 42 + .../print-event/print-event-file-result.json} | 0 .../print-event/print-event-file.json | 6 +- .../print-event/print-event-post.json | 2 +- .../print-event/print-event.spec.ts | 37 + .../stx-event/stx-event-file-result.json} | 0 .../stx-event/stx-event-file.json | 9 +- .../stx-event/stx-event-post.json | 2 +- .../stx-event/stx-event.spec.ts | 37 + .../transaction/transaction-file-result.json} | 0 .../transaction/transaction-file.json | 6 +- .../transaction/transaction-post.json | 2 +- .../transaction/transaction.spec.ts | 50 + automate/tests/tsconfig.json | 13 + automate/tests/utility/browser-instance.ts | 40 + automate/tests/utility/post-page-instance.ts | 57 + automate/tests/utility/utils.ts | 23 + automate/tsconfig.json | 35 +- .../contract-call-file-result.json | 464 + .../contract-call/contract-call-file.json | 4 +- .../contract-call/contract-call-post.json | 0 58 files changed, 27212 insertions(+), 608 deletions(-) create mode 100644 automate/Chainhook.toml create mode 100755 automate/jest.config.js mode change 100755 => 100644 automate/package.json create mode 100644 automate/playwright.config.js mode change 100755 => 100644 automate/readme.md delete mode 100755 automate/script/index.ts delete mode 100644 automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json delete mode 100644 automate/script/stacks-predicates/index.ts delete mode 100644 automate/script/stacks-predicates/predicate-commands.json delete mode 100755 automate/script/utils/helper.ts create mode 100644 automate/tests/bitcoin-predicates/transaction/transaction-post.json create mode 100644 automate/tests/bitcoin-predicates/transaction/transaction.spec.ts create mode 100644 automate/tests/mocks/index.ts create mode 100644 automate/tests/selectors/postPage.selectors.ts create mode 100644 automate/tests/setup-tests.ts rename automate/{script/stacks-predicates/block-height/block-height-file.result.json => tests/stacks-predicates/block-height/block-height-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/block-height/block-height-file.json (63%) rename automate/{script => tests}/stacks-predicates/block-height/block-height-post.json (74%) create mode 100644 automate/tests/stacks-predicates/block-height/block-height.spec.ts rename automate/{script/stacks-predicates/contract-call/contract-call-file.result.json => tests/stacks-predicates/contract-call/contract-call-file-result.json} (100%) create mode 100644 automate/tests/stacks-predicates/contract-call/contract-call-file.json create mode 100644 automate/tests/stacks-predicates/contract-call/contract-call-post.json create mode 100644 automate/tests/stacks-predicates/contract-call/contract-call.spec.ts rename automate/{script/stacks-predicates/contract-deployment/contract-deployment-file.result.json => tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/contract-deployment/contract-deployment-file.json (54%) create mode 100644 automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json create mode 100644 automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts rename automate/{script/stacks-predicates/ft-event/ft-event-file.result.json => tests/stacks-predicates/ft-event/ft-event-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/ft-event/ft-event-file.json (70%) rename automate/{script => tests}/stacks-predicates/ft-event/ft-event-post.json (75%) create mode 100644 automate/tests/stacks-predicates/ft-event/ft-event.spec.ts rename automate/{script/stacks-predicates/nft-event/nft-event-file.result.json => tests/stacks-predicates/nft-event/nft-event-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/nft-event/nft-event-file.json (74%) rename automate/{script => tests}/stacks-predicates/nft-event/nft-event-post.json (78%) create mode 100644 automate/tests/stacks-predicates/nft-event/nft-event.spec.ts create mode 100644 automate/tests/stacks-predicates/predicate-commands.json rename automate/{script/stacks-predicates/print-event/print-event-file.result.json => tests/stacks-predicates/print-event/print-event-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/print-event/print-event-file.json (73%) rename automate/{script => tests}/stacks-predicates/print-event/print-event-post.json (76%) create mode 100644 automate/tests/stacks-predicates/print-event/print-event.spec.ts rename automate/{script/stacks-predicates/stx-event/stx-event-file.result.json => tests/stacks-predicates/stx-event/stx-event-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/stx-event/stx-event-file.json (63%) rename automate/{script => tests}/stacks-predicates/stx-event/stx-event-post.json (73%) create mode 100644 automate/tests/stacks-predicates/stx-event/stx-event.spec.ts rename automate/{script/stacks-predicates/transaction/transaction-file.result.json => tests/stacks-predicates/transaction/transaction-file-result.json} (100%) rename automate/{script => tests}/stacks-predicates/transaction/transaction-file.json (72%) rename automate/{script => tests}/stacks-predicates/transaction/transaction-post.json (64%) create mode 100644 automate/tests/stacks-predicates/transaction/transaction.spec.ts create mode 100644 automate/tests/tsconfig.json create mode 100644 automate/tests/utility/browser-instance.ts create mode 100644 automate/tests/utility/post-page-instance.ts create mode 100644 automate/tests/utility/utils.ts create mode 100644 tests/stacks-predicates/contract-call/contract-call-file-result.json rename {automate/script => tests}/stacks-predicates/contract-call/contract-call-file.json (94%) rename {automate/script => tests}/stacks-predicates/contract-call/contract-call-post.json (100%) diff --git a/automate/.env b/automate/.env index 9a6686347..5f08869a1 100644 --- a/automate/.env +++ b/automate/.env @@ -1 +1 @@ -DOMAIN_URL="https://webhook.site/db639532-0288-44e3-9add-1584af436d6d" \ No newline at end of file +DOMAIN_URL="https://a738-2405-201-200a-3191-40d5-db02-efa-357.ngrok.io" diff --git a/automate/Chainhook.toml b/automate/Chainhook.toml new file mode 100644 index 000000000..8b94a5415 --- /dev/null +++ b/automate/Chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "testnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "root" +bitcoind_rpc_password = "root" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_url = "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest" diff --git a/automate/jest.config.js b/automate/jest.config.js new file mode 100755 index 000000000..2b6c331d4 --- /dev/null +++ b/automate/jest.config.js @@ -0,0 +1,13 @@ +module.exports = { + collectCoverage: true, + coverageReporters: ['html', 'json-summary'], + collectCoverageFrom: ['tests/*.ts'], + testEnvironment: 'node', + setupFiles: ["/tests/setup-tests.ts"], + moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node', 'd.ts'], + roots: ['/tests'], + preset: 'ts-jest', + testMatch: ['**/?(*.)+(spec).(js|ts|tsx)'], + testRunner: 'jest-circus/runner', + cacheDirectory: '/.jest-cache', +}; diff --git a/automate/package-lock.json b/automate/package-lock.json index 48abea843..f17e886c9 100644 --- a/automate/package-lock.json +++ b/automate/package-lock.json @@ -1,234 +1,25910 @@ { - "name": "custom_stacks_application", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "custom_stacks_application", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "dotenv": "^16.0.3" - }, - "devDependencies": { - "@types/node": "^18.11.12", - "prettier": "2.8.1", - "ts-node": "^10.9.1", - "typescript": "^4.9.4" - } + "name": "chainhook-playwright", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "chainhook-playwright", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@types/express": "^4.17.17", + "express": "^4.18.2" + }, + "devDependencies": { + "@babel/core": "7.16.5", + "@babel/plugin-proposal-class-properties": "7.16.5", + "@babel/plugin-transform-regenerator": "7.16.5", + "@babel/plugin-transform-runtime": "7.16.5", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/preset-typescript": "7.16.5", + "@babel/runtime": "7.16.5", + "@playwright/test": "^1.25.1", + "@types/chroma-js": "2.1.3", + "@types/chrome": "0.0.171", + "@types/jest": "27.0.3", + "@types/jest-dev-server": "5.0.0", + "@types/jsdom": "16.2.14", + "@types/just-debounce-it": "1.5.0", + "@types/node": "^17.0.45", + "@types/webpack": "5.28.0", + "@types/webpack-dev-server": "4.5.0", + "dotenv": "10.0.0", + "eslint": "7.32.0", + "jest": "^27.0.7", + "jest-chrome": "0.7.2", + "jest-circus": "27.3.1", + "jest-dev-server": "6.0.0", + "jest-junit": "13.0.0", + "playwright": "^1.25.1", + "playwright-chromium": "1.17.1", + "playwright-core": "1.17.1", + "prettier": "^2.7.1", + "puppeteer": "^17.0.0", + "puppeteer-core": "^17.0.0", + "ts-jest": "27.0.7", + "ts-node": "10.4", + "typescript": "4.5.4", + "webpack-cli": "4.9.1", + "webpack-dev-server": "^4.10.1", + "webpack-hot-middleware": "2.25.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.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, + "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, + "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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "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-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "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, + "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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "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, + "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, + "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, + "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, + "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, + "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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "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-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, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.5.tgz", + "integrity": "sha512-gxpfS8XQWDbQ8oP5NcmpXxtEgCJkbO+W9VhZlOhr0xPyVaRjAQPOv7ZDj9fg0d5s9+NiVvMCE6gbkEkcsxwGRw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz", + "integrity": "sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.16.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz", + "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "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 + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-consumer": "0.8.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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, + "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/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/core/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/core/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/environment/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/fake-timers/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/globals/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/globals/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/reporters/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/reporters/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/reporters/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/test-result/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-sequencer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/test-sequencer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/test-sequencer/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/test-sequencer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/@jest/transform/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/transform/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@jest/transform/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "@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/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@playwright/test": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.1.tgz", + "integrity": "sha512-YK7yGWK0N3C2QInPU6iaf/L3N95dlGdbsezLya4n0ZCh3IL7VgPGxC6Gnznh9ApWdOmkJeleT2kMTcWPRZvzqg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "playwright-core": "1.36.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/@playwright/test/node_modules/playwright-core": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz", + "integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "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, + "optional": true, + "peer": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "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 + }, + "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 + }, + "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 + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chroma-js": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz", + "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g==", + "dev": true + }, + "node_modules/@types/chrome": { + "version": "0.0.171", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.171.tgz", + "integrity": "sha512-CnCwFKI3COygib3DNJrCjePeoU2OCDGGbUcmftXtQ3loMABsLgwpG8z+LxV4kjQJFzmJDqOyhCSsbY9yyEfapQ==", + "dev": true, + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "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.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/filesystem": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "dev": true, + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", + "dev": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/har-format": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.11.tgz", + "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "dev": true, + "dependencies": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/jest-dev-server": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/jest-dev-server/-/jest-dev-server-5.0.0.tgz", + "integrity": "sha512-2o5mY2c/WTXO0j+FrtWMxDt0NBi0o6R6aNx4xaym/OfVP8owAeZa582eFxQEqZ7KzHDqvkEEJ9YZ9O3Zw/MpPw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/wait-on": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.14.tgz", + "integrity": "sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/just-debounce-it": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/just-debounce-it/-/just-debounce-it-1.5.0.tgz", + "integrity": "sha512-X0idscP49ASBe/yI29yLpBG1p/bae72yDMWsBGzxS1aaKinUl0Q2FkYVBMs+BXlVi3yPm4boWsiuFTQ0Dzw3dw==", + "deprecated": "This is a stub types definition. just-debounce-it provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "just-debounce-it": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/@types/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-f2SeAxumolBmhuR62vNGTsSAvdz/Oj0k682xNrcKJ4dmRnTPODB74j6CPoNPzBPTHsu7Y7W7u93Mgp8Ovo8vWw==", + "deprecated": "This is a stub types definition. parse5 provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "parse5": "*" + } + }, + "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 + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "node_modules/@types/wait-on": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", + "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webpack": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", + "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "node_modules/@types/webpack-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-SklLlklFBfTyIXo1iWXxzeytjlysWfj5QfIcRJrCc7MgzuCjnZOHXviQwe81iFGq9ZkCUXAg2fpbZdHhj5lSWA==", + "deprecated": "This is a stub types definition. webpack-dev-middleware provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "webpack-dev-middleware": "*" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-4.5.0.tgz", + "integrity": "sha512-HMb6pZPANObue3LwbdpQLWzQyF9O0wntiPyXj4vGutlAbNKTXH4hDCHaZyfvfZDmFn+5HprrWHm1TGt3awNr/A==", + "dev": true, + "dependencies": { + "@types/bonjour": "*", + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-index": "*", + "@types/serve-static": "*", + "@types/webpack-dev-middleware": "*", + "chokidar": "^3.5.1", + "http-proxy-middleware": "^2.0.0", + "webpack": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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, + "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, + "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/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.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, + "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": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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==", + "dev": true + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "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, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "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/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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==" + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "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, + "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, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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 + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "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" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "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 + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", + "dev": true, + "dependencies": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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 + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/devtools-protocol": { + "version": "0.0.1036444", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1036444.tgz", + "integrity": "sha512-0y4f/T8H9lsESV9kKP1HDUXgHxCdniFeJh6Erq+FbdOEvp/Ydp9t8kcAAM5gOd17pMrTDlFWntoHtzzeTUWKNw==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "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==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "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==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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, + "engines": { + "node": ">=4.0" + } + }, + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "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, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "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/execa/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/expect/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/expect/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expect/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expect/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expect/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/expect/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/expect/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.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/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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==", + "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==" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "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 + }, + "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 + }, + "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 + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "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, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "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==", + "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==", + "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==" + }, + "node_modules/find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", + "dev": true, + "dependencies": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", + "dev": true, + "dependencies": { + "find-file-up": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-process": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", + "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "bin": { + "find-process": "bin/find-process.js" + } + }, + "node_modules/find-process/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/find-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/find-process/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/find-process/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/find-process/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-process/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "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, + "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==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "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==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", + "dev": true, + "dependencies": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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==", + "dev": true, + "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/hpack.js/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==", + "dev": true + }, + "node_modules/hpack.js/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==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "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 + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "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==", + "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/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "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, + "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, + "engines": { + "node": ">=10.17.0" + } + }, + "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==", + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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, + "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, + "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, + "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==", + "dev": true, + "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==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 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==", + "dev": true + }, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "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==", + "dev": true, + "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, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, + "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/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-changed-files/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-changed-files/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-chrome": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jest-chrome/-/jest-chrome-0.7.2.tgz", + "integrity": "sha512-RSRDi8qNX54Q3ltSC2rW25+47nwY4DoruHOjHR0JZxijITS2PZrQ3j0jZPP3ywC0GuX0JNNwsKD3+iaKzOJEAA==", + "dev": true, + "dependencies": { + "@types/chrome": "^0.0.114" + }, + "peerDependencies": { + "jest": "^26.0.1 || ^27.0.0" + } + }, + "node_modules/jest-chrome/node_modules/@types/chrome": { + "version": "0.0.114", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.114.tgz", + "integrity": "sha512-i7qRr74IrxHtbnrZSKUuP5Uvd5EOKwlwJq/yp7+yTPihOXnPhNQO4Z5bqb1XTnrjdbUKEJicaVVbhcgtRijmLA==", + "dev": true, + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/jest-circus": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.3.1.tgz", + "integrity": "sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/types": "^27.2.5", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.3.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-config/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-config/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-dev-server": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.0.tgz", + "integrity": "sha512-6X8+/gtFeZBfX7fX3BTAnZzPbdDYcWUdhsvcbJI5PsDXdJ06VNMPqwcPP7ZR5hUeXyvww6CX6ro+oIiARHo5Sg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "cwd": "^0.10.0", + "find-process": "^1.4.5", + "prompts": "^2.4.1", + "spawnd": "^6.0.0", + "tree-kill": "^1.2.2", + "wait-on": "^6.0.0" + } + }, + "node_modules/jest-dev-server/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-dev-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-dev-server/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-dev-server/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-dev-server/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-dev-server/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-environment-jsdom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-environment-node/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@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.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "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-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-junit": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-mock/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-mock/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-mock/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "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": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-resolve-dependencies/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/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, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runner/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runner/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-runtime/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runtime/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-snapshot/node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-snapshot/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/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, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.6.1", + "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/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, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, + "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 + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-debounce-it": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.2.0.tgz", + "integrity": "sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "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, + "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, + "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 + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "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 + }, + "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 + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/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, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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 + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "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==" + }, + "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 + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "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==", + "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, + "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==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "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 + }, + "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==", + "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 + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "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-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/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 + }, + "node_modules/node-fetch/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, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "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 + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "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, + "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, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "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, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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, + "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, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "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/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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, + "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==", + "dev": true, + "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, + "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==", + "dev": true + }, + "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==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "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, + "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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.36.1.tgz", + "integrity": "sha512-2ZqHpD0U0COKR8bqR3W5IkyIAAM0mT9FgGJB9xWCI1qAUkqLxJskA1ueeQOTH2Qfz3+oxdwwf2EzdOX+RkZmmQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "playwright-core": "1.36.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/playwright-chromium": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.17.1.tgz", + "integrity": "sha512-EnCtsP/QTWWoQV/cFYpt2wgKwcOdoa2iHBlBaldHB8gobtynMKwk96rzldaRS4YimFibIzREFkWCNMrrb3LRMQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "playwright-core": "=1.17.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/playwright-core": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.17.1.tgz", + "integrity": "sha512-C3c8RpPiC3qr15fRDN6dx6WnUkPLFmST37gms2aoHPDRvp7EaGDPMMZPpqIm/QWB5J40xDrQCD4YYHz2nBTojQ==", + "dev": true, + "dependencies": { + "commander": "^8.2.0", + "debug": "^4.1.1", + "extract-zip": "^2.0.1", + "https-proxy-agent": "^5.0.0", + "jpeg-js": "^0.4.2", + "mime": "^2.4.6", + "pngjs": "^5.0.0", + "progress": "^2.0.3", + "proper-lockfile": "^4.1.1", + "proxy-from-env": "^1.1.0", + "rimraf": "^3.0.2", + "socks-proxy-agent": "^6.1.0", + "stack-utils": "^2.0.3", + "ws": "^7.4.6", + "yauzl": "^2.10.0", + "yazl": "^2.5.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/playwright-core/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/playwright/node_modules/playwright-core": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz", + "integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "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, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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, + "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==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-17.1.3.tgz", + "integrity": "sha512-tVtvNSOOqlq75rUgwLeDAEQoLIiBqmRg0/zedpI6fuqIocIkuxG23A7FIl1oVSkuSMMLgcOP5kVhNETmsmjvPw==", + "deprecated": "< 19.4.0 is no longer supported", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1036444", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.1" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-17.1.3.tgz", + "integrity": "sha512-gm3d5fTVEc+h7jVtT3Y1k8OL1awaOzln44UfsJhUJKH/tyO/wn/zOxyAHTQt9aX/yo37IS0dfisU3i3P8qvZnw==", + "dev": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1036444", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.1" + }, + "engines": { + "node": ">=14.1.0" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "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/puppeteer/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "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/qs": { + "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" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", + "dev": true, + "dependencies": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "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" + }, + "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==", + "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==" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "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 + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawnd": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.2.0.tgz", + "integrity": "sha512-qX/I4lQy4KgVEcNle0kuc4FxFWHISzBhZW1YemPfwmrmQjyZmfTK/OhBKkhrD2ooAaFZEm1maEBLE6/6enwt+g==", + "dev": true, + "dependencies": { + "exit": "^0.1.2", + "signal-exit": "^3.0.7", + "tree-kill": "^1.2.2" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "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 + }, + "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, + "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, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "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, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "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 + }, + "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, + "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==", + "dev": true, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@types/jest": "^27.0.0", + "babel-jest": ">=27.0.0 <28", + "jest": "^27.0.0", + "typescript": ">=3.8 <5.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "babel-jest": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/ts-jest/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/ts-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.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", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.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-node/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "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, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "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" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.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==", + "dev": true + }, + "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==", + "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==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dev": true, + "dependencies": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "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/webpack-hot-middleware": { + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", + "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", + "dev": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "querystring": "^0.2.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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==", + "dev": true, + "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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "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/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": 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==", + "dev": true, + "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 + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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/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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true + }, + "@babel/core": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", + "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", + "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@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, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.5.tgz", + "integrity": "sha512-gxpfS8XQWDbQ8oP5NcmpXxtEgCJkbO+W9VhZlOhr0xPyVaRjAQPOv7ZDj9fg0d5s9+NiVvMCE6gbkEkcsxwGRw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", + "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.5.tgz", + "integrity": "sha512-3kzUOQeaxY/2vhPDS7CX/KGEGu/1bOYGvdRDJ2U5yjEz5o5jmIeTPLoiQBPGjfhPascLuW5OlMiPzwOOuB6txg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.16.5", + "@babel/plugin-transform-react-jsx": "^7.16.5", + "@babel/plugin-transform-react-jsx-development": "^7.16.5", + "@babel/plugin-transform-react-pure-annotations": "^7.16.5" + } + }, + "@babel/preset-typescript": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz", + "integrity": "sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.16.1" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz", + "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@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 + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + } + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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, + "requires": { + "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" + }, + "dependencies": { + "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 + } + } + }, + "@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 + }, + "@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "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, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "node_modules/@types/node": { - "version": "18.16.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@playwright/test": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.1.tgz", + "integrity": "sha512-YK7yGWK0N3C2QInPU6iaf/L3N95dlGdbsezLya4n0ZCh3IL7VgPGxC6Gnznh9ApWdOmkJeleT2kMTcWPRZvzqg==", + "dev": true, + "requires": { + "@types/node": "*", + "fsevents": "2.3.2", + "playwright-core": "1.36.1" + }, + "dependencies": { + "playwright-core": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz", + "integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==", + "dev": true + } + } + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "@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, + "optional": true, + "peer": true + }, + "@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@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 + }, + "@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 + }, + "@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 + }, + "@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dev": true, + "requires": { + "@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.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/chroma-js": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.1.3.tgz", + "integrity": "sha512-1xGPhoSGY1CPmXLCBcjVZSQinFjL26vlR8ZqprsBWiFyED4JacJJ9zHhh5aaUXqbY9B37mKQ73nlydVAXmr1+g==", + "dev": true + }, + "@types/chrome": { + "version": "0.0.171", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.171.tgz", + "integrity": "sha512-CnCwFKI3COygib3DNJrCjePeoU2OCDGGbUcmftXtQ3loMABsLgwpG8z+LxV4kjQJFzmJDqOyhCSsbY9yyEfapQ==", + "dev": true, + "requires": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/filesystem": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.32.tgz", + "integrity": "sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ==", + "dev": true, + "requires": { + "@types/filewriter": "*" + } + }, + "@types/filewriter": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz", + "integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==", + "dev": true + }, + "@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/har-format": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.11.tgz", + "integrity": "sha512-T232/TneofqK30AD1LRrrf8KnjLvzrjWDp7eWST5KoiSzrBfRsLrWDPk4STQPW4NZG6v2MltnduBVmakbZOBIQ==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "27.0.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.3.tgz", + "integrity": "sha512-cmmwv9t7gBYt7hNKH5Spu7Kuu/DotGa+Ff+JGRKZ4db5eh8PnKS4LuebJ3YLUoyOyIHraTGyULn23YtEAm0VSg==", + "dev": true, + "requires": { + "jest-diff": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "@types/jest-dev-server": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/jest-dev-server/-/jest-dev-server-5.0.0.tgz", + "integrity": "sha512-2o5mY2c/WTXO0j+FrtWMxDt0NBi0o6R6aNx4xaym/OfVP8owAeZa582eFxQEqZ7KzHDqvkEEJ9YZ9O3Zw/MpPw==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/wait-on": "*" + } + }, + "@types/jsdom": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.14.tgz", + "integrity": "sha512-6BAy1xXEmMuHeAJ4Fv4yXKwBDTGTOseExKE3OaHiNycdHdZw59KfYzrt0DkDluvwmik1HRt6QS7bImxUmpSy+w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/parse5": "*", + "@types/tough-cookie": "*" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/just-debounce-it": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/just-debounce-it/-/just-debounce-it-1.5.0.tgz", + "integrity": "sha512-X0idscP49ASBe/yI29yLpBG1p/bae72yDMWsBGzxS1aaKinUl0Q2FkYVBMs+BXlVi3yPm4boWsiuFTQ0Dzw3dw==", + "dev": true, + "requires": { + "just-debounce-it": "*" + } + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "@types/parse5": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-7.0.0.tgz", + "integrity": "sha512-f2SeAxumolBmhuR62vNGTsSAvdz/Oj0k682xNrcKJ4dmRnTPODB74j6CPoNPzBPTHsu7Y7W7u93Mgp8Ovo8vWw==", + "dev": true, + "requires": { + "parse5": "*" + } + }, + "@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 + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "@types/wait-on": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@types/wait-on/-/wait-on-5.3.1.tgz", + "integrity": "sha512-2FFOKCF/YydrMUaqg+fkk49qf0e5rDgwt6aQsMzFQzbS419h2gNOXyiwp/o2yYy27bi/C1z+HgfncryjGzlvgQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/webpack": { + "version": "5.28.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz", + "integrity": "sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==", + "dev": true, + "requires": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "@types/webpack-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-SklLlklFBfTyIXo1iWXxzeytjlysWfj5QfIcRJrCc7MgzuCjnZOHXviQwe81iFGq9ZkCUXAg2fpbZdHhj5lSWA==", + "dev": true, + "requires": { + "webpack-dev-middleware": "*" + } + }, + "@types/webpack-dev-server": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-4.5.0.tgz", + "integrity": "sha512-HMb6pZPANObue3LwbdpQLWzQyF9O0wntiPyXj4vGutlAbNKTXH4hDCHaZyfvfZDmFn+5HprrWHm1TGt3awNr/A==", + "dev": true, + "requires": { + "@types/bonjour": "*", + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-index": "*", + "@types/serve-static": "*", + "@types/webpack-dev-middleware": "*", + "chokidar": "^3.5.1", + "http-proxy-middleware": "^2.0.0", + "webpack": "*" + } + }, + "@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "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==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "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, + "requires": {} + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "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, + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "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, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "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, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.7" + } + }, + "babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "requires": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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, + "requires": { + "@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": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "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, + "requires": { + "@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": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "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, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "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, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "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 + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "dev": true + }, + "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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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 + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "color-name": "1.1.3" + } + }, + "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 + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "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==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "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==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "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": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dev": true, + "requires": { + "browserslist": "^4.21.9" + } + }, + "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==", + "dev": true + }, + "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 + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "requires": { + "node-fetch": "2.6.7" + } + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "cwd": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", + "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", + "dev": true, + "requires": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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 + }, + "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 + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "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 + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "devtools-protocol": { + "version": "0.0.1036444", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1036444.tgz", + "integrity": "sha512-0y4f/T8H9lsESV9kKP1HDUXgHxCdniFeJh6Erq+FbdOEvp/Ydp9t8kcAAM5gOd17pMrTDlFWntoHtzzeTUWKNw==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "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==" + }, + "electron-to-chromium": { + "version": "1.4.468", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz", + "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==", + "dev": true + }, + "emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true + }, + "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==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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==" + }, + "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 + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "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, + "optional": true + } + } + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "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 + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "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, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "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 + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "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, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "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 + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", + "dev": true, + "requires": { + "os-homedir": "^1.0.1" + } + }, + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.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" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "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 + }, + "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 + }, + "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 + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "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, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-file-up": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", + "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", + "dev": true, + "requires": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + } + }, + "find-pkg": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", + "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", + "dev": true, + "requires": { + "find-file-up": "^0.1.2" + } + }, + "find-process": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", + "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "commander": "^5.1.0", + "debug": "^4.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", + "dev": true + }, + "fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "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 + }, + "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==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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-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, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", + "dev": true, + "requires": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "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 + }, + "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==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, + "html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true + }, + "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 + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "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==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "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, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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 + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "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, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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==", + "dev": true + }, + "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 + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "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, + "requires": { + "@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-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + } + }, + "jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-chrome": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jest-chrome/-/jest-chrome-0.7.2.tgz", + "integrity": "sha512-RSRDi8qNX54Q3ltSC2rW25+47nwY4DoruHOjHR0JZxijITS2PZrQ3j0jZPP3ywC0GuX0JNNwsKD3+iaKzOJEAA==", + "dev": true, + "requires": { + "@types/chrome": "^0.0.114" + }, + "dependencies": { + "@types/chrome": { + "version": "0.0.114", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.114.tgz", + "integrity": "sha512-i7qRr74IrxHtbnrZSKUuP5Uvd5EOKwlwJq/yp7+yTPihOXnPhNQO4Z5bqb1XTnrjdbUKEJicaVVbhcgtRijmLA==", + "dev": true, + "requires": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + } + } + }, + "jest-circus": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.3.1.tgz", + "integrity": "sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==", + "dev": true, + "requires": { + "@jest/environment": "^27.3.1", + "@jest/test-result": "^27.3.1", + "@jest/types": "^27.2.5", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.3.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.3.1", + "jest-matcher-utils": "^27.3.1", + "jest-message-util": "^27.3.1", + "jest-runtime": "^27.3.1", + "jest-snapshot": "^27.3.1", + "jest-util": "^27.3.1", + "pretty-format": "^27.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "requires": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + } + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-dev-server": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.0.0.tgz", + "integrity": "sha512-6X8+/gtFeZBfX7fX3BTAnZzPbdDYcWUdhsvcbJI5PsDXdJ06VNMPqwcPP7ZR5hUeXyvww6CX6ro+oIiARHo5Sg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "cwd": "^0.10.0", + "find-process": "^1.4.5", + "prompts": "^2.4.1", + "spawnd": "^6.0.0", + "tree-kill": "^1.2.2", + "wait-on": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true + }, + "jest-haste-map": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/types": "^29.6.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + } + }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-junit": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + } + }, + "jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "requires": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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, + "requires": {} + }, + "jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "optional": true, + "peer": true + }, + "jest-resolve": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.6.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "requires": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } }, - "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 - }, - "node_modules/prettier": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", - "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } + }, + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, + "jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "requires": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "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 - } + "jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "requires": { + "has-flag": "^4.0.0" + } } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-validate": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/types": "^29.6.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "optional": true, + "peer": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true + }, + "jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "optional": true, + "peer": true + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "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, + "optional": true, + "peer": true } + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "requires": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, - "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 - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jest-worker": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/node": "*", + "jest-util": "^29.6.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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, + "optional": true, + "peer": true + }, + "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, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "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 + }, + "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 + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "just-debounce-it": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-3.2.0.tgz", + "integrity": "sha512-WXzwLL0745uNuedrCsCs3rpmfD6DBaf7uuVwaq98/8dafURfgQaBsSpjiPp5+CW6Vjltwy9cOGI6qE71b3T8iQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "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 + }, + "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, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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 + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "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 + }, + "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 + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "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, + "requires": { + "yallist": "^3.0.2" + } + }, + "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, + "requires": { + "semver": "^6.0.0" + } + }, + "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 + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "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==" + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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 + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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==", + "requires": { + "mime-db": "1.52.0" + } + }, + "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 + }, + "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==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "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 + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "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 + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "path-key": "^3.0.0" + } + }, + "nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "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, + "requires": { + "p-try": "^2.0.0" + } + }, + "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, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "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 + }, + "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, + "requires": { + "callsites": "^3.0.0" + } + }, + "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, + "requires": { + "@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" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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 + }, + "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==", + "dev": true + }, + "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 + }, + "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==", + "dev": true + }, + "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==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "find-up": "^4.0.0" + } + }, + "playwright": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.36.1.tgz", + "integrity": "sha512-2ZqHpD0U0COKR8bqR3W5IkyIAAM0mT9FgGJB9xWCI1qAUkqLxJskA1ueeQOTH2Qfz3+oxdwwf2EzdOX+RkZmmQ==", + "dev": true, + "requires": { + "playwright-core": "1.36.1" + }, + "dependencies": { + "playwright-core": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz", + "integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==", + "dev": true + } + } + }, + "playwright-chromium": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/playwright-chromium/-/playwright-chromium-1.17.1.tgz", + "integrity": "sha512-EnCtsP/QTWWoQV/cFYpt2wgKwcOdoa2iHBlBaldHB8gobtynMKwk96rzldaRS4YimFibIzREFkWCNMrrb3LRMQ==", + "dev": true, + "requires": { + "playwright-core": "=1.17.1" + } + }, + "playwright-core": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.17.1.tgz", + "integrity": "sha512-C3c8RpPiC3qr15fRDN6dx6WnUkPLFmST37gms2aoHPDRvp7EaGDPMMZPpqIm/QWB5J40xDrQCD4YYHz2nBTojQ==", + "dev": true, + "requires": { + "commander": "^8.2.0", + "debug": "^4.1.1", + "extract-zip": "^2.0.1", + "https-proxy-agent": "^5.0.0", + "jpeg-js": "^0.4.2", + "mime": "^2.4.6", + "pngjs": "^5.0.0", + "progress": "^2.0.3", + "proper-lockfile": "^4.1.1", + "proxy-from-env": "^1.1.0", + "rimraf": "^3.0.2", + "socks-proxy-agent": "^6.1.0", + "stack-utils": "^2.0.3", + "ws": "^7.4.6", + "yauzl": "^2.10.0", + "yazl": "^2.5.1" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "dev": true + }, + "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 + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "dependencies": { + "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 + } + } + }, + "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==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "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==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "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==" + } + } + }, + "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==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "puppeteer": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-17.1.3.tgz", + "integrity": "sha512-tVtvNSOOqlq75rUgwLeDAEQoLIiBqmRg0/zedpI6fuqIocIkuxG23A7FIl1oVSkuSMMLgcOP5kVhNETmsmjvPw==", + "dev": true, + "requires": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1036444", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.1" + }, + "dependencies": { + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "requires": {} + } + } + }, + "puppeteer-core": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-17.1.3.tgz", + "integrity": "sha512-gm3d5fTVEc+h7jVtT3Y1k8OL1awaOzln44UfsJhUJKH/tyO/wn/zOxyAHTQt9aX/yo37IS0dfisU3i3P8qvZnw==", + "dev": true, + "requires": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.1036444", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.8.1" + }, + "dependencies": { + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "dev": true, + "requires": {} + } + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "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==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + } + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "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==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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 + } + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", + "dev": true, + "requires": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + } + }, + "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 + }, + "resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "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==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "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 + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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 + } + } + }, + "spawnd": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.2.0.tgz", + "integrity": "sha512-qX/I4lQy4KgVEcNle0kuc4FxFWHISzBhZW1YemPfwmrmQjyZmfTK/OhBKkhrD2ooAaFZEm1maEBLE6/6enwt+g==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "signal-exit": "^3.0.7", + "tree-kill": "^1.2.2" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "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, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "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, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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==", + "dev": true + }, + "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 + }, + "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==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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==", + "dev": true + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "dependencies": { + "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 + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "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 + }, + "throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "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 + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-jest": { + "version": "27.0.7", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", + "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^27.0.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "dependencies": { + "@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + } + }, + "@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "requires": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.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", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "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, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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 + }, + "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 + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "dev": true + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "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==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "wait-on": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", + "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", + "dev": true, + "requires": { + "axios": "^0.25.0", + "joi": "^17.6.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.5.4" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "webpack": { + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + } + } + }, + "webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} + } + } + }, + "webpack-hot-middleware": { + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", + "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "querystring": "^0.2.0", + "strip-ansi": "^6.0.0" + } + }, + "webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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-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==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } + } } diff --git a/automate/package.json b/automate/package.json old mode 100755 new mode 100644 index 36e5f1524..deb2189a3 --- a/automate/package.json +++ b/automate/package.json @@ -1,24 +1,54 @@ { - "name": "custom_stacks_application", - "version": "1.0.0", - "description": "", - "main": "index.js", - "dependencies": { - "dotenv": "^16.0.3" - }, - "devDependencies": { - "@types/node": "^18.11.12", - "prettier": "2.8.1", - "ts-node": "^10.9.1", - "typescript": "^4.9.4" - }, - "scripts": { - "predicates": "ts-node ./script/index.ts", - "file-predicates": "ts-node ./script/index.ts file", - "post-predicates": "ts-node ./script/index.ts post", - "clear-result-files": "ts-node ./script/index.ts clear-result-files" - }, - "keywords": [], - "author": "", - "license": "ISC" + "name": "chainhook-playwright", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "predicates": "./node_modules/jest/bin/jest.js --runInBand --testPathPattern=./tests/stacks-predicates/contract-call/*" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "@babel/core": "7.16.5", + "@babel/plugin-proposal-class-properties": "7.16.5", + "@babel/plugin-transform-regenerator": "7.16.5", + "@babel/plugin-transform-runtime": "7.16.5", + "@babel/preset-env": "7.16.5", + "@babel/preset-react": "7.16.5", + "@babel/preset-typescript": "7.16.5", + "@babel/runtime": "7.16.5", + "@playwright/test": "^1.25.1", + "@types/chroma-js": "2.1.3", + "@types/chrome": "0.0.171", + "@types/jest": "27.0.3", + "@types/jest-dev-server": "5.0.0", + "@types/jsdom": "16.2.14", + "@types/just-debounce-it": "1.5.0", + "@types/node": "^17.0.45", + "@types/webpack": "5.28.0", + "@types/webpack-dev-server": "4.5.0", + "dotenv": "10.0.0", + "eslint": "7.32.0", + "jest": "^27.0.7", + "jest-chrome": "0.7.2", + "jest-circus": "27.3.1", + "jest-dev-server": "6.0.0", + "jest-junit": "13.0.0", + "playwright": "^1.25.1", + "playwright-chromium": "1.17.1", + "playwright-core": "1.17.1", + "prettier": "^2.7.1", + "puppeteer": "^17.0.0", + "puppeteer-core": "^17.0.0", + "ts-jest": "27.0.7", + "ts-node": "10.4", + "typescript": "4.5.4", + "webpack-cli": "4.9.1", + "webpack-dev-server": "^4.10.1", + "webpack-hot-middleware": "2.25.1" + }, + "dependencies": { + "@types/express": "^4.17.17", + "express": "^4.18.2" + } } diff --git a/automate/playwright.config.js b/automate/playwright.config.js new file mode 100644 index 000000000..ffd535511 --- /dev/null +++ b/automate/playwright.config.js @@ -0,0 +1,6 @@ +// playwright.config.ts +const config = { + testDir: "./tests", +}; + +module.exports = config; diff --git a/automate/readme.md b/automate/readme.md old mode 100755 new mode 100644 index d0fa73455..524b9e371 --- a/automate/readme.md +++ b/automate/readme.md @@ -1,20 +1,21 @@ # automate-chainhooks -automate-chainhooks is a node script for running the chainhooks predicate. +automate-chainhooks is a npm script for automation testing of [chainhook](https://github.com/hirosystems/chainhook/blob/5791379655fba786abf6e265311c0d789a8722e5/docs/getting-started.md) ### Prerequisites - - npm installed and Node v16.* - [ngrok](https://dev.to/ibrarturi/how-to-test-webhooks-on-your-localhost-3b4f) - [chainhook](https://github.com/hirosystems/chainhook/blob/5791379655fba786abf6e265311c0d789a8722e5/docs/getting-started.md) +- [zeromq] (https://zeromq.org/download/) + ### Run script 1. Go to the root of the project and do `npm install`. Make sure you have satisfied the above Prerequisites. -2. Start ngrok using the command `ngrok http 127.0.0.1:3009`. Once it starts, provide the ngrok URL in the `.env` file for `DOMAIN_URL`. This is required to post the result for the http predicates. You can check the ngrok requests at `localhost:4040` +2. Start ngrok using the command `ngrok http 3006`. Once it starts, provide the ngrok URL in the `.env` file for `DOMAIN_URL`. This is required to post the result for the http predicates. You can check the ngrok requests at `localhost:4040` 3. Run all the predicates: ```sh $ npm run predicates 4. Run all the file result predicates: - ```sh + ```sh $ npm run file-predicates 5. Run all the POST URL predicates: ```sh @@ -45,4 +46,8 @@ automate-chainhooks is a node script for running the chainhooks predicate. $ predicate=block-height npm run predicates 14. Run stx-event predicate for file append and POST ```sh - $ predicate=stx-event npm run predicates \ No newline at end of file + $ predicate=stx-event npm run predicates + + +### Bitcoin +Run the bitcoind with `./bitcoind -rpcuser=root -rpcpassword=root`. Set this user and root in `Chainhook.toml` file and run the command as `chainhook predicates scan /home/user/tests/stacks-predicates/transaction/transaction-bitcoin-file.json --config-path=./Chainhook.toml` \ No newline at end of file diff --git a/automate/script/index.ts b/automate/script/index.ts deleted file mode 100755 index 7faa2dca1..000000000 --- a/automate/script/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - triggerAllPredicates, - triggerAllFilePredicates, - triggerAllPOSTPredicates, -} from "./stacks-predicates"; -import { initDomainAPI, clearResultFiles } from "./utils/helper"; -require("dotenv").config({ path: ".env" }); - -const type = process.argv[2]; -if (!type) { - initDomainAPI(); - triggerAllPredicates(); -} - -if (type === "file") { - triggerAllFilePredicates(); -} - -if (type === "post") { - triggerAllPOSTPredicates(); -} - -if (type === "clear-result-files") { - clearResultFiles(); -} \ No newline at end of file diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json b/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json deleted file mode 100644 index 3cbb5ab51..000000000 --- a/automate/script/stacks-predicates/contract-deployment/contract-deployment-post.json +++ /dev/null @@ -1 +0,0 @@ -{"chain":"stacks","uuid":"8625d9df-a41d-49e9-aece-44280428cc78","name":"Contract Deployment post","version":1,"networks":{"testnet":{"start_block":0,"end_block":311800,"if_this":{"scope":"contract_deployment","deployer":"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/script/stacks-predicates/index.ts b/automate/script/stacks-predicates/index.ts deleted file mode 100644 index d06a28ea3..000000000 --- a/automate/script/stacks-predicates/index.ts +++ /dev/null @@ -1,227 +0,0 @@ -import * as util from "util"; -import * as fs from "fs"; -import * as child_process from "child_process"; -const exec = util.promisify(child_process.exec); -import predicateCommands from "./predicate-commands.json"; - -export const triggerAllPredicates = async () => { - const selectedPredicate = process.env.predicate; - if (!selectedPredicate) { - await triggerTransaction(); - await triggerPrintEvent(); - await triggerNFTEvent(); - await triggerFTEvent(); - await triggerContractDeployment(); - await triggerContractCall(); - await triggerBlockHeight(); - await triggerSTXEvent(); - } - if (selectedPredicate === "transaction") { - await triggerTransaction(); - } - if (selectedPredicate === "print-event") { - await triggerPrintEvent(); - } - if (selectedPredicate === "nft-event") { - await triggerNFTEvent(); - } - if (selectedPredicate === "ft-event") { - await triggerFTEvent(); - } - if (selectedPredicate === "contract-deployment") { - await triggerContractDeployment(); - } - if (selectedPredicate === "contract-call") { - await triggerContractCall(); - } - if (selectedPredicate === "block-height") { - await triggerBlockHeight(); - } - if (selectedPredicate === "stx-event") { - await triggerSTXEvent(); - } -}; - -export const triggerAllFilePredicates = async () => { - await transactionFilePredicate(); - await stxEventFilePredicate(); - await printEventFilePredicate(); - await NFTEventFilePredicate(); - await FTEventFilePredicate(); - await contractDeploymentFilePredicate(); - await contractCallFilePredicate(); - await blockHeightFilePredicate(); -}; - -export const triggerAllPOSTPredicates = async () => { - await transactionPOSTPredicate(); - await stxEventPOSTPredicate(); - await printEventPOSTPredicate(); - await NFTEventPOSTPredicate(); - await FTEventPOSTPredicate(); - await contractDeploymentPOSTPredicate(); - await contractCallPOSTPredicate(); - await blockHeightPOSTPredicate(); -}; - -const triggerTransaction = async (): Promise => { - console.log("EXECUTING predicate for transaction"); - await transactionFilePredicate(); - await transactionPOSTPredicate(); - console.log("COMPLETED predicate for transaction"); -}; - -const triggerSTXEvent = async (): Promise => { - console.log("EXECUTING predicate for STX Event"); - await stxEventFilePredicate(); - await stxEventPOSTPredicate(); - console.log("COMPLETED predicate for STX Event"); -}; - -const triggerPrintEvent = async (): Promise => { - console.log("EXECUTING predicate for print Event"); - await printEventFilePredicate(); - await printEventPOSTPredicate(); - console.log("COMPLETED predicate for print Event"); -}; - -const triggerNFTEvent = async (): Promise => { - console.log("EXECUTING predicate for NFT Event"); - await NFTEventFilePredicate(); - await NFTEventPOSTPredicate(); - console.log("COMPLETED predicate for NFT Event"); -}; - -const triggerFTEvent = async (): Promise => { - console.log("EXECUTING predicate for FT Event"); - await FTEventFilePredicate(); - await FTEventPOSTPredicate(); - console.log("COMPLETED predicate for FT Event"); -}; - -const triggerContractDeployment = async (): Promise => { - console.log("EXECUTING predicate for Contract Deployment"); - await contractDeploymentFilePredicate(); - await contractDeploymentPOSTPredicate(); - console.log("COMPLETED predicate for Contract Deployment"); -}; - -const triggerContractCall = async (): Promise => { - console.log("EXECUTING predicate for Contract Call"); - await contractCallFilePredicate(); - await contractCallPOSTPredicate(); - console.log("COMPLETED predicate for Contract Call"); -}; - -const triggerBlockHeight = async (): Promise => { - console.log("EXECUTING predicate for Block Height"); - await blockHeightFilePredicate(); - await blockHeightPOSTPredicate(); - console.log("COMPLETED predicate for Block Height"); -}; - -const transactionFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.transaction_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.transaction_file.command - ); - console.log(stderr); -}; - -const transactionPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.transaction_post); - console.log(stderr); -}; - -const stxEventFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.stx_event_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.stx_event_file.command - ); - console.log(stderr); -}; - -const stxEventPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.stx_event_post); - console.log(stderr); -}; - -const printEventFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.print_event_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.print_event_file.command - ); - console.log(stderr); -}; - -const printEventPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.print_event_post); - console.log(stderr); -}; - -const NFTEventFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.nft_event_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.nft_event_file.command - ); - console.log(stderr); -}; - -const NFTEventPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.nft_event_post); - console.log(stderr); -}; - -const FTEventFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.ft_event_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.ft_event_file.command - ); - console.log(stderr); -}; - -const FTEventPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.ft_event_post); - console.log(stderr); -}; - -const contractDeploymentFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.contract_deployment_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.contract_deployment_file.command - ); - console.log(stderr); -}; - -const contractDeploymentPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec( - predicateCommands.contract_deployment_post - ); - console.log(stderr); -}; - -const contractCallFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.contract_call_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.contract_call_file.command - ); - console.log(stderr); -}; - -const contractCallPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.contract_call_post); - console.log(stderr); -}; - -const blockHeightFilePredicate = async (): Promise => { - fs.writeFileSync(predicateCommands.block_height_file.result_file, ""); - const { stdout, stderr } = await exec( - predicateCommands.block_height_file.command - ); - console.log(stderr); -}; - -const blockHeightPOSTPredicate = async (): Promise => { - const { stdout, stderr } = await exec(predicateCommands.block_height_post); - console.log(stderr); -}; diff --git a/automate/script/stacks-predicates/predicate-commands.json b/automate/script/stacks-predicates/predicate-commands.json deleted file mode 100644 index 17d6db511..000000000 --- a/automate/script/stacks-predicates/predicate-commands.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "transaction_file": { - "command": "chainhook predicates scan script/stacks-predicates/transaction/transaction-file.json --testnet", - "result_file": "script/stacks-predicates/transaction/transaction-file.result.json" - }, - "transaction_post": "chainhook predicates scan script/stacks-predicates/transaction/transaction-post.json --testnet", - "block_height_file": { - "command": "chainhook predicates scan script/stacks-predicates/block-height/block-height-file.json --testnet", - "result_file": "script/stacks-predicates/block-height/block-height-file.result.json" - }, - "block_height_post": "chainhook predicates scan script/stacks-predicates/block-height/block-height-post.json --testnet", - "ft_event_file": { - "command": "chainhook predicates scan script/stacks-predicates/ft-event/ft-event-file.json --testnet", - "result_file": "script/stacks-predicates/ft-event/ft-event-file.result.json" - }, - "ft_event_post": "chainhook predicates scan script/stacks-predicates/ft-event/ft-event-post.json --testnet", - "nft_event_file": { - "command": "chainhook predicates scan script/stacks-predicates/nft-event/nft-event-file.json --testnet", - "result_file": "script/stacks-predicates/nft-event/nft-event-file.result.json" - }, - "nft_event_post": "chainhook predicates scan script/stacks-predicates/nft-event/nft-event-post.json --testnet", - "stx_event_file": { - "command": "chainhook predicates scan script/stacks-predicates/stx-event/stx-event-file.json --testnet", - "result_file": "script/stacks-predicates/stx-event/stx-event-file.result.json" - }, - "stx_event_post": "chainhook predicates scan script/stacks-predicates/stx-event/stx-event-post.json --testnet", - "print_event_file": { - "command": "chainhook predicates scan script/stacks-predicates/print-event/print-event-file.json --testnet", - "result_file": "script/stacks-predicates/print-event/print-event-file.result.json" - }, - "print_event_post": "chainhook predicates scan script/stacks-predicates/print-event/print-event-post.json --testnet", - "contract_call_file": { - "command": "chainhook predicates scan script/stacks-predicates/contract-call/contract-call-file.json --testnet", - "result_file": "script/stacks-predicates/contract-call/contract-call-file.result.json" - }, - "contract_call_post": "chainhook predicates scan script/stacks-predicates/contract-call/contract-call-post.json --testnet", - "contract_deployment_file": { - "command": "chainhook predicates scan script/stacks-predicates/contract-deployment/contract-deployment-file.json --testnet", - "result_file": "script/stacks-predicates/contract-deployment/contract-deployment-file.result.json" - }, - "contract_deployment_post": "chainhook predicates scan script/stacks-predicates/contract-deployment/contract-deployment-post.json --testnet" -} diff --git a/automate/script/utils/helper.ts b/automate/script/utils/helper.ts deleted file mode 100755 index 83bb35c8d..000000000 --- a/automate/script/utils/helper.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as fs from "fs"; -const stacksPostFile = [ - "transaction/transaction", - "block-height/block-height", - "ft-event/ft-event", - "nft-event/nft-event", - "stx-event/stx-event", - "print-event/print-event", - "contract-call/contract-call", - "contract-deployment/contract-deployment" -]; -export const initDomainAPI = async (): Promise => { - initTestnetStacksPOSTURL(); -}; - -const initTestnetStacksPOSTURL = () => { - const domainURL = process.env.DOMAIN_URL; - if (!domainURL) { - console.log("Please set the domain url for POST predicates"); - process.exit(1); - } - - stacksPostFile.map((postFile) => { - const fileContent = JSON.parse( - fs.readFileSync(`script/stacks-predicates/${postFile}-post.json`, "utf8") - ); - fileContent.networks.testnet.then_that.http_post.url = domainURL; - fs.writeFileSync(`script/stacks-predicates/${postFile}-post.json`, JSON.stringify(fileContent)); - }); -}; - -export const clearResultFiles = () => { - stacksPostFile.map((postFile) => { - fs.writeFileSync(`script/stacks-predicates/${postFile}-file.result.json`, ''); - }); -}; diff --git a/automate/tests/bitcoin-predicates/transaction/transaction-post.json b/automate/tests/bitcoin-predicates/transaction/transaction-post.json new file mode 100644 index 000000000..0851f3e34 --- /dev/null +++ b/automate/tests/bitcoin-predicates/transaction/transaction-post.json @@ -0,0 +1,22 @@ +{ + "uuid": "1", + "name": "Hello Ordinals", + "chain": "bitcoin", + "version": 1, + "networks": { + "testnet": { + "start_block": 800497, + "end_block": 800500, + "if_this": { + "scope": "txid", + "equals": "c8231a9b232e26692a41cba9b6df34c421745fb49a84c495d960bf7ce940bc7d" + }, + "then_that": { + "http_post": { + "url": "https://webhook.site/6068d324-bb7f-4c91-b619-560832b91d4c", + "authorization_header": "" + } + } + } + } +} \ No newline at end of file diff --git a/automate/tests/bitcoin-predicates/transaction/transaction.spec.ts b/automate/tests/bitcoin-predicates/transaction/transaction.spec.ts new file mode 100644 index 000000000..b818fb6de --- /dev/null +++ b/automate/tests/bitcoin-predicates/transaction/transaction.spec.ts @@ -0,0 +1,51 @@ +import { getPOSTPage } from "../../utility/browser-instance"; +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; +import { wait } from "../../utility/utils"; +import { PostPageInstance } from "../../utility/post-page-instance"; + +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +const expectedTxId = "0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b"; + +jest.setTimeout(45 * 60 * 1000); // 45 mins + +describe("Transaction:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for transaction"); + await transactionFilePredicate(); + console.log("COMPLETED file-append predicate for transaction"); + const result = await transactionFileResult(); + const actualTxId = result.apply[0]?.transactions[0]?.transaction_identifier.hash; + expect(actualTxId).toEqual(expectedTxId); + }); + + // it("post test", async () => { + // console.log("EXECUTING post predicate for transaction"); + // const { stdout, stderr } = await exec(predicateCommands.transaction_post); + // console.log(stderr); + // console.log("COMPLETED post predicate for transaction"); + // // get the POST page from the browser + // const postPage: PostPageInstance = await getPOSTPage(); + // const result = await postPage.getPOSTResult(); + // const actualTxId = result.apply[0]?.transactions[0]?.transaction_identifier.hash; + // expect(actualTxId).toEqual(expectedTxId); + // await postPage.closeBrowser(); + // }); +}); + +const transactionFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.transaction_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.transaction_file.command + ); + console.log(stderr); +}; + +const transactionFileResult = async (): Promise => { + const fileContent = JSON.parse( + fs.readFileSync(predicateCommands.transaction_file.result_file, "utf8") + ); + return fileContent; +}; diff --git a/automate/tests/mocks/index.ts b/automate/tests/mocks/index.ts new file mode 100644 index 000000000..aa2dc7fed --- /dev/null +++ b/automate/tests/mocks/index.ts @@ -0,0 +1 @@ +export const NGROK_DASHBOARD: string = "localhost:4040"; \ No newline at end of file diff --git a/automate/tests/selectors/postPage.selectors.ts b/automate/tests/selectors/postPage.selectors.ts new file mode 100644 index 000000000..de8dd7582 --- /dev/null +++ b/automate/tests/selectors/postPage.selectors.ts @@ -0,0 +1,6 @@ +export enum PostPageSelectors { + Request = "request", + RequestTab2 = "request-tab-2", + RequestPane2 = "request-pane-2", + ClearRequest = "Clear Requests" +} diff --git a/automate/tests/setup-tests.ts b/automate/tests/setup-tests.ts new file mode 100644 index 000000000..61e4276b5 --- /dev/null +++ b/automate/tests/setup-tests.ts @@ -0,0 +1,53 @@ +import * as dotenv from 'dotenv'; +import * as fs from "fs"; +import express from 'express'; + +const app: express.Application = express(); +const port: number = 3006; + +dotenv.config({ path: '.env' }); + +const stacksPostFile = [ + "transaction/transaction", + "block-height/block-height", + "ft-event/ft-event", + "nft-event/nft-event", + "stx-event/stx-event", + "print-event/print-event", + "contract-call/contract-call", + "contract-deployment/contract-deployment" +]; + +const initTestnetStacksPOSTURL = () => { + const domainURL = process.env.DOMAIN_URL; + if (!domainURL) { + console.log("Please set the domain url for POST predicates"); + process.exit(1); + } + + stacksPostFile.map((postFile) => { + const fileContent = JSON.parse( + fs.readFileSync(`tests/stacks-predicates/${postFile}-post.json`, "utf8") + ); + fileContent.networks.testnet.then_that.http_post.url = domainURL; + fs.writeFileSync(`tests/stacks-predicates/${postFile}-post.json`, JSON.stringify(fileContent)); + }); +}; + +initTestnetStacksPOSTURL(); + +// register routes for POST predicate and start server +app.get('*', (_req, _res) => { + console.log(`Invoked GET at http://localhost:${port}/`); + _res.status(200).send('acknowledge'); +}); + +app.post('*', (_req, _res) => { + console.log(`Invoked POST at http://localhost:${port}/`); + _res.status(200).send('acknowledge'); +}); + +// Server setup +app.listen(port, () => { + console.log(`Listening at http://localhost:${port}/`); +}); \ No newline at end of file diff --git a/automate/script/stacks-predicates/block-height/block-height-file.result.json b/automate/tests/stacks-predicates/block-height/block-height-file-result.json similarity index 100% rename from automate/script/stacks-predicates/block-height/block-height-file.result.json rename to automate/tests/stacks-predicates/block-height/block-height-file-result.json diff --git a/automate/script/stacks-predicates/block-height/block-height-file.json b/automate/tests/stacks-predicates/block-height/block-height-file.json similarity index 63% rename from automate/script/stacks-predicates/block-height/block-height-file.json rename to automate/tests/stacks-predicates/block-height/block-height-file.json index 3761cb973..87a406bde 100644 --- a/automate/script/stacks-predicates/block-height/block-height-file.json +++ b/automate/tests/stacks-predicates/block-height/block-height-file.json @@ -5,15 +5,15 @@ "version": 1, "networks": { "testnet": { - "start_block": 111785, - "end_block": 111795, + "start_block": 114259, + "end_block": 114261, "if_this": { "scope": "block_height", - "equals": 111790 + "equals": 114260 }, "then_that": { "file_append": { - "path": "script/stacks-predicates/block-height/block-height-file.result.json" + "path": "tests/stacks-predicates/block-height/block-height-file-result.json" } } } diff --git a/automate/script/stacks-predicates/block-height/block-height-post.json b/automate/tests/stacks-predicates/block-height/block-height-post.json similarity index 74% rename from automate/script/stacks-predicates/block-height/block-height-post.json rename to automate/tests/stacks-predicates/block-height/block-height-post.json index 560cf1146..7d87910c3 100644 --- a/automate/script/stacks-predicates/block-height/block-height-post.json +++ b/automate/tests/stacks-predicates/block-height/block-height-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"fa95ed2c-6d0b-49eb-90cd-71875122f71d","name":"Block Height Post","version":1,"networks":{"testnet":{"start_block":111785,"end_block":111795,"if_this":{"scope":"block_height","equals":111790},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"fa95ed2c-6d0b-49eb-90cd-71875122f71d","name":"Block Height Post","version":1,"networks":{"testnet":{"start_block":111785,"end_block":111795,"if_this":{"scope":"block_height","equals":111790},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/block-height/block-height.spec.ts b/automate/tests/stacks-predicates/block-height/block-height.spec.ts new file mode 100644 index 000000000..558a4b5ec --- /dev/null +++ b/automate/tests/stacks-predicates/block-height/block-height.spec.ts @@ -0,0 +1,37 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; + +jest.setTimeout(45 * 60 * 1000); // 45 mins + +// TODO: Ask that this this block height: 114260 brings all the data which is very huge +describe("block-height:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for Block Height"); + await blockHeightFilePredicate(); + console.log("COMPLETED file-append predicate for Block Height"); + const result = await blockHeightFileResult(); + expect(0).toEqual(1); + }); +}); + +const blockHeightFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.block_height_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.block_height_file.command + ); + console.log(stderr); +}; + +const blockHeightFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.block_height_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/contract-call/contract-call-file.result.json b/automate/tests/stacks-predicates/contract-call/contract-call-file-result.json similarity index 100% rename from automate/script/stacks-predicates/contract-call/contract-call-file.result.json rename to automate/tests/stacks-predicates/contract-call/contract-call-file-result.json diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-file.json b/automate/tests/stacks-predicates/contract-call/contract-call-file.json new file mode 100644 index 000000000..afd594ce6 --- /dev/null +++ b/automate/tests/stacks-predicates/contract-call/contract-call-file.json @@ -0,0 +1,23 @@ +{ + "chain": "stacks", + "uuid": "0dcfe481-ef9e-40f7-ad7b-1a9a39895516", + "name": "Contract Call File", + "version": 1, + "networks": { + "testnet": { + "start_block": 111779, + "end_block": 111781, + "expire_after_occurrence": 1, + "if_this": { + "scope": "contract_call", + "contract_identifier": "ST000000000000000000002AMW42H.bns", + "method": "name-revoke" + }, + "then_that": { + "file_append": { + "path": "tests/stacks-predicates/contract-call/contract-call-file-result.json" + } + } + } + } +} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-post.json b/automate/tests/stacks-predicates/contract-call/contract-call-post.json new file mode 100644 index 000000000..e641856ed --- /dev/null +++ b/automate/tests/stacks-predicates/contract-call/contract-call-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"35ed0323-7549-41ee-a546-ab00d453a681","name":"Contract Call Post","version":1,"networks":{"testnet":{"start_block":111779,"end_block":111781,"expire_after_occurrence":1,"if_this":{"scope":"contract_call","contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"then_that":{"http_post":{"url":"https://a738-2405-201-200a-3191-40d5-db02-efa-357.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/contract-call/contract-call.spec.ts b/automate/tests/stacks-predicates/contract-call/contract-call.spec.ts new file mode 100644 index 000000000..e5ff1e46d --- /dev/null +++ b/automate/tests/stacks-predicates/contract-call/contract-call.spec.ts @@ -0,0 +1,57 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import { getPOSTPage } from "../../utility/browser-instance"; +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; +import { PostPageInstance } from "../../utility/post-page-instance"; +const expectedIdentifier = "ST000000000000000000002AMW42H.bns"; + +jest.setTimeout(45 * 60 * 1000); // 45 mins + +describe("contract-call:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for Contract Call"); + await contractCallFilePredicate(); + console.log("COMPLETED file-append predicate for Contract Call"); + const result = await contractCallFileResult(); + const actualIdentifier = result.apply[0]?.transactions[0]?.metadata?.kind?.data?.contract_identifier; + const actualType = result.apply[0]?.transactions[0]?.metadata?.kind?.type; + expect(actualIdentifier).toEqual(expectedIdentifier); + expect(actualType).toEqual("ContractCall"); + }); + + it("post test", async () => { + console.log("EXECUTING post predicate for Contract Call"); + const { stdout, stderr } = await exec(predicateCommands.transaction_post); + console.log(stderr); + console.log("COMPLETED post predicate for Contract Call"); + // get the POST page from the browser + const postPage: PostPageInstance = await getPOSTPage(); + const result = await postPage.getPOSTResult(); + const actualIdentifier = result.apply[0]?.transactions[0]?.metadata?.kind?.data?.contract_identifier; + const actualType = result.apply[0]?.transactions[0]?.metadata?.kind?.type; + expect(actualIdentifier).toEqual(expectedIdentifier); + expect(actualType).toEqual("ContractCall"); + }); + +}); + +const contractCallFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.contract_call_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.contract_call_file.command + ); + console.log(stderr); +}; + +const contractCallFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.contract_call_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.result.json b/automate/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json similarity index 100% rename from automate/script/stacks-predicates/contract-deployment/contract-deployment-file.result.json rename to automate/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json diff --git a/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json b/automate/tests/stacks-predicates/contract-deployment/contract-deployment-file.json similarity index 54% rename from automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json rename to automate/tests/stacks-predicates/contract-deployment/contract-deployment-file.json index d912dbd33..d46d9527e 100644 --- a/automate/script/stacks-predicates/contract-deployment/contract-deployment-file.json +++ b/automate/tests/stacks-predicates/contract-deployment/contract-deployment-file.json @@ -5,15 +5,16 @@ "version": 1, "networks": { "testnet": { - "start_block": 0, - "end_block": 311800, + "start_block": 113580, + "end_block": 113585, + "expire_after_occurrence": 1, "if_this": { "scope": "contract_deployment", - "deployer": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM" + "deployer": "ST20X3DC5R091J8B6YPQT638J8NR1W83KN6JQ4P6F" }, "then_that": { "file_append": { - "path": "script/stacks-predicates/contract-deployment/contract-deployment-file.result.json" + "path": "tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json" } } } diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json b/automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json new file mode 100644 index 000000000..15688aead --- /dev/null +++ b/automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json @@ -0,0 +1 @@ +{"chain":"stacks","uuid":"8625d9df-a41d-49e9-aece-44280428cc78","name":"Contract Deployment post","version":1,"networks":{"testnet":{"start_block":113580,"end_block":113585,"expire_after_occurrence":1,"if_this":{"scope":"contract_deployment","deployer":"ST20X3DC5R091J8B6YPQT638J8NR1W83KN6JQ4P6F"},"then_that":{"http_post":{"url":"https://a738-2405-201-200a-3191-40d5-db02-efa-357.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts b/automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts new file mode 100644 index 000000000..abdac660d --- /dev/null +++ b/automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts @@ -0,0 +1,59 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import { getPOSTPage } from "../../utility/browser-instance"; +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; +import { PostPageInstance } from "../../utility/post-page-instance"; +const expectedIdentifier = "ST20X3DC5R091J8B6YPQT638J8NR1W83KN6JQ4P6F"; + +jest.setTimeout(45 * 60 * 1000); // 45 mins + +describe("contract-deployment:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for Contract Deployment"); + await contractDeploymentFilePredicate(); + console.log("COMPLETED file-append predicate for Contract Deployment"); + const result = await contractDeploymentFileResult(); + const actualIdentifier = result.apply[0]?.transactions[0]?.metadata?.kind?.data?.contract_identifier; + const actualType = result.apply[0]?.transactions[0]?.metadata?.kind?.type; + expect(actualIdentifier).toContain(expectedIdentifier); + expect(actualType).toEqual("ContractDeployment"); + }); + + it("post test", async () => { + console.log("EXECUTING post predicate for Contract Deployment"); + const { stdout, stderr } = await exec(predicateCommands.transaction_post); + console.log(stderr); + console.log("COMPLETED post predicate for Contract Deployment"); + // get the POST page from the browser + const postPage: PostPageInstance = await getPOSTPage(); + const result = await postPage.getPOSTResult(); + + const actualIdentifier = result.apply[0]?.transactions[0]?.metadata?.kind?.data?.contract_identifier; + const actualType = result.apply[0]?.transactions[0]?.metadata?.kind?.type; + expect(actualIdentifier).toContain(expectedIdentifier); + expect(actualType).toEqual("ContractDeployment"); + }); +}); + + + +const contractDeploymentFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.contract_deployment_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.contract_deployment_file.command + ); + console.log(stderr); +}; + +const contractDeploymentFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.contract_deployment_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/ft-event/ft-event-file.result.json b/automate/tests/stacks-predicates/ft-event/ft-event-file-result.json similarity index 100% rename from automate/script/stacks-predicates/ft-event/ft-event-file.result.json rename to automate/tests/stacks-predicates/ft-event/ft-event-file-result.json diff --git a/automate/script/stacks-predicates/ft-event/ft-event-file.json b/automate/tests/stacks-predicates/ft-event/ft-event-file.json similarity index 70% rename from automate/script/stacks-predicates/ft-event/ft-event-file.json rename to automate/tests/stacks-predicates/ft-event/ft-event-file.json index 9b0bb3113..a8e6cc2c2 100644 --- a/automate/script/stacks-predicates/ft-event/ft-event-file.json +++ b/automate/tests/stacks-predicates/ft-event/ft-event-file.json @@ -5,8 +5,9 @@ "version": 1, "networks": { "testnet": { - "start_block": 26000, - "end_block": 26050, + "start_block": 111779, + "end_block": 111781, + "expire_after_occurrence": 1, "if_this": { "scope": "ft_event", "asset_identifier": "ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty", @@ -14,7 +15,7 @@ }, "then_that": { "file_append": { - "path": "script/stacks-predicates/ft-event/ft-event-file.result.json" + "path": "tests/stacks-predicates/ft-event/ft-event-file-result.json" } } } diff --git a/automate/script/stacks-predicates/ft-event/ft-event-post.json b/automate/tests/stacks-predicates/ft-event/ft-event-post.json similarity index 75% rename from automate/script/stacks-predicates/ft-event/ft-event-post.json rename to automate/tests/stacks-predicates/ft-event/ft-event-post.json index add6a1ff2..e984772df 100644 --- a/automate/script/stacks-predicates/ft-event/ft-event-post.json +++ b/automate/tests/stacks-predicates/ft-event/ft-event-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"1cf16403-be82-4c69-99d7-7083b5a36434","name":"FT Event POST","version":1,"networks":{"testnet":{"start_block":26000,"end_block":26050,"if_this":{"scope":"ft_event","asset_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty","actions":["transfer"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"1cf16403-be82-4c69-99d7-7083b5a36434","name":"FT Event POST","version":1,"networks":{"testnet":{"start_block":26000,"end_block":26050,"if_this":{"scope":"ft_event","asset_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty","actions":["transfer"]},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/ft-event/ft-event.spec.ts b/automate/tests/stacks-predicates/ft-event/ft-event.spec.ts new file mode 100644 index 000000000..f5a4e6e87 --- /dev/null +++ b/automate/tests/stacks-predicates/ft-event/ft-event.spec.ts @@ -0,0 +1,37 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; + +jest.setTimeout(30 * 60 * 1000); // 30 mins + +// TODO: Ask that this asset_identifier: ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin::shitty brings all the blocks +describe("ft-event:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for FT Event"); + await FTEventFilePredicate(); + console.log("COMPLETED file-append predicate for FT Event"); + const result = await FTEventFileResult(); + expect(0).toEqual(1); + }); +}); + +const FTEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.ft_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.ft_event_file.command + ); + console.log(stderr); +}; + +const FTEventFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.ft_event_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/nft-event/nft-event-file.result.json b/automate/tests/stacks-predicates/nft-event/nft-event-file-result.json similarity index 100% rename from automate/script/stacks-predicates/nft-event/nft-event-file.result.json rename to automate/tests/stacks-predicates/nft-event/nft-event-file-result.json diff --git a/automate/script/stacks-predicates/nft-event/nft-event-file.json b/automate/tests/stacks-predicates/nft-event/nft-event-file.json similarity index 74% rename from automate/script/stacks-predicates/nft-event/nft-event-file.json rename to automate/tests/stacks-predicates/nft-event/nft-event-file.json index 14f7a5e06..257cf94f1 100644 --- a/automate/script/stacks-predicates/nft-event/nft-event-file.json +++ b/automate/tests/stacks-predicates/nft-event/nft-event-file.json @@ -5,8 +5,8 @@ "version": 1, "networks": { "testnet": { - "start_block": 0, - "end_block": 411850, + "start_block": 60150, + "end_block": 60153, "if_this": { "scope": "nft_event", "asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3", @@ -14,7 +14,7 @@ }, "then_that": { "file_append": { - "path": "script/stacks-predicates/nft-event/nft-event-file.result.json" + "path": "tests/stacks-predicates/nft-event/nft-event-file-result.json" } } } diff --git a/automate/script/stacks-predicates/nft-event/nft-event-post.json b/automate/tests/stacks-predicates/nft-event/nft-event-post.json similarity index 78% rename from automate/script/stacks-predicates/nft-event/nft-event-post.json rename to automate/tests/stacks-predicates/nft-event/nft-event-post.json index c800a823f..b724956fd 100644 --- a/automate/script/stacks-predicates/nft-event/nft-event-post.json +++ b/automate/tests/stacks-predicates/nft-event/nft-event-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"fc0eb094-be0f-42b5-b7a6-6100d9c512cb","name":"nft event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":411850,"if_this":{"scope":"nft_event","asset_identifier":"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3","actions":["claim"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"fc0eb094-be0f-42b5-b7a6-6100d9c512cb","name":"nft event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":411850,"if_this":{"scope":"nft_event","asset_identifier":"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3","actions":["claim"]},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/nft-event/nft-event.spec.ts b/automate/tests/stacks-predicates/nft-event/nft-event.spec.ts new file mode 100644 index 000000000..153fca1cc --- /dev/null +++ b/automate/tests/stacks-predicates/nft-event/nft-event.spec.ts @@ -0,0 +1,37 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; + +jest.setTimeout(30 * 60 * 1000); // 30 mins + +// TODO: Ask that this asset_identifier: ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.punker-nft3 does not have any match +describe("nft-event:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for NFT Event"); + await NFTEventFilePredicate(); + console.log("COMPLETED file-append predicate for NFT Event"); + const result = await NFTEventFileResult(); + expect(0).toEqual(1); + }); +}); + +const NFTEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.nft_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.nft_event_file.command + ); + console.log(stderr); +}; + +const NFTEventFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.nft_event_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; \ No newline at end of file diff --git a/automate/tests/stacks-predicates/predicate-commands.json b/automate/tests/stacks-predicates/predicate-commands.json new file mode 100644 index 000000000..4925a471f --- /dev/null +++ b/automate/tests/stacks-predicates/predicate-commands.json @@ -0,0 +1,42 @@ +{ + "transaction_file": { + "command": "chainhook predicates scan tests/stacks-predicates/transaction/transaction-file.json --testnet", + "result_file": "tests/stacks-predicates/transaction/transaction-file-result.json" + }, + "transaction_post": "chainhook predicates scan tests/stacks-predicates/transaction/transaction-post.json --testnet", + "block_height_file": { + "command": "chainhook predicates scan tests/stacks-predicates/block-height/block-height-file.json --testnet", + "result_file": "tests/stacks-predicates/block-height/block-height-file-result.json" + }, + "block_height_post": "chainhook predicates scan tests/stacks-predicates/block-height/block-height-post.json --testnet", + "ft_event_file": { + "command": "chainhook predicates scan tests/stacks-predicates/ft-event/ft-event-file.json --testnet", + "result_file": "tests/stacks-predicates/ft-event/ft-event-file-result.json" + }, + "ft_event_post": "chainhook predicates scan tests/stacks-predicates/ft-event/ft-event-post.json --testnet", + "nft_event_file": { + "command": "chainhook predicates scan tests/stacks-predicates/nft-event/nft-event-file.json --testnet", + "result_file": "tests/stacks-predicates/nft-event/nft-event-file-result.json" + }, + "nft_event_post": "chainhook predicates scan tests/stacks-predicates/nft-event/nft-event-post.json --testnet", + "stx_event_file": { + "command": "chainhook predicates scan tests/stacks-predicates/stx-event/stx-event-file.json --testnet", + "result_file": "tests/stacks-predicates/stx-event/stx-event-file-result.json" + }, + "stx_event_post": "chainhook predicates scan tests/stacks-predicates/stx-event/stx-event-post.json --testnet", + "print_event_file": { + "command": "chainhook predicates scan tests/stacks-predicates/print-event/print-event-file.json --testnet", + "result_file": "tests/stacks-predicates/print-event/print-event-file-result.json" + }, + "print_event_post": "chainhook predicates scan tests/stacks-predicates/print-event/print-event-post.json --testnet", + "contract_call_file": { + "command": "chainhook predicates scan tests/stacks-predicates/contract-call/contract-call-file.json --testnet", + "result_file": "tests/stacks-predicates/contract-call/contract-call-file-result.json" + }, + "contract_call_post": "chainhook predicates scan tests/stacks-predicates/contract-call/contract-call-post.json --testnet", + "contract_deployment_file": { + "command": "chainhook predicates scan tests/stacks-predicates/contract-deployment/contract-deployment-file.json --testnet", + "result_file": "tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json" + }, + "contract_deployment_post": "chainhook predicates scan tests/stacks-predicates/contract-deployment/contract-deployment-post.json --testnet" +} diff --git a/automate/script/stacks-predicates/print-event/print-event-file.result.json b/automate/tests/stacks-predicates/print-event/print-event-file-result.json similarity index 100% rename from automate/script/stacks-predicates/print-event/print-event-file.result.json rename to automate/tests/stacks-predicates/print-event/print-event-file-result.json diff --git a/automate/script/stacks-predicates/print-event/print-event-file.json b/automate/tests/stacks-predicates/print-event/print-event-file.json similarity index 73% rename from automate/script/stacks-predicates/print-event/print-event-file.json rename to automate/tests/stacks-predicates/print-event/print-event-file.json index f410baa76..cc404a79f 100644 --- a/automate/script/stacks-predicates/print-event/print-event-file.json +++ b/automate/tests/stacks-predicates/print-event/print-event-file.json @@ -5,8 +5,8 @@ "version": 1, "networks": { "testnet": { - "start_block": 0, - "end_block": 511800, + "start_block": 1000, + "expire_after_occurrence": 1, "if_this": { "scope": "print_event", "contract_identifier": "ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin", @@ -14,7 +14,7 @@ }, "then_that": { "file_append": { - "path": "script/stacks-predicates/print-event/print-event-file.result.json" + "path": "tests/stacks-predicates/print-event/print-event-file-result.json" } } } diff --git a/automate/script/stacks-predicates/print-event/print-event-post.json b/automate/tests/stacks-predicates/print-event/print-event-post.json similarity index 76% rename from automate/script/stacks-predicates/print-event/print-event-post.json rename to automate/tests/stacks-predicates/print-event/print-event-post.json index 76858c765..d2113a897 100644 --- a/automate/script/stacks-predicates/print-event/print-event-post.json +++ b/automate/tests/stacks-predicates/print-event/print-event-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"220b8661-6b64-44ea-93e5-db0657212b60","name":"print event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":511800,"if_this":{"scope":"print_event","contract_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin","contains":"balance-of"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"220b8661-6b64-44ea-93e5-db0657212b60","name":"print event post","version":1,"networks":{"testnet":{"start_block":0,"end_block":511800,"if_this":{"scope":"print_event","contract_identifier":"ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin","contains":"balance-of"},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/print-event/print-event.spec.ts b/automate/tests/stacks-predicates/print-event/print-event.spec.ts new file mode 100644 index 000000000..98a96e518 --- /dev/null +++ b/automate/tests/stacks-predicates/print-event/print-event.spec.ts @@ -0,0 +1,37 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; + +jest.setTimeout(30 * 60 * 1000); // 30 mins + +// TODO: Ask that this contract_identifier: ST113MYNN52BC76GWP8P9PYFEP7XWJP6S5YFQM4ZE.shitty-coin does not have any match +describe("print-event:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for print Event"); + await printEventFilePredicate(); + console.log("COMPLETED file-append predicate for print Event"); + const result = await printEventFileResult(); + expect(0).toEqual(1); + }); +}); + +const printEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.print_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.print_event_file.command + ); + console.log(stderr); +}; + +const printEventFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.print_event_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/stx-event/stx-event-file.result.json b/automate/tests/stacks-predicates/stx-event/stx-event-file-result.json similarity index 100% rename from automate/script/stacks-predicates/stx-event/stx-event-file.result.json rename to automate/tests/stacks-predicates/stx-event/stx-event-file-result.json diff --git a/automate/script/stacks-predicates/stx-event/stx-event-file.json b/automate/tests/stacks-predicates/stx-event/stx-event-file.json similarity index 63% rename from automate/script/stacks-predicates/stx-event/stx-event-file.json rename to automate/tests/stacks-predicates/stx-event/stx-event-file.json index 761053774..9ca518f06 100644 --- a/automate/script/stacks-predicates/stx-event/stx-event-file.json +++ b/automate/tests/stacks-predicates/stx-event/stx-event-file.json @@ -5,17 +5,18 @@ "version": 1, "networks": { "testnet": { - "start_block": 111750, - "end_block": 111780, "if_this": { "scope": "stx_event", "actions": ["transfer", "lock"] }, "then_that": { "file_append": { - "path": "script/stacks-predicates/stx-event/stx-event-file.result.json" + "path": "tests/stacks-predicates/stx-event/stx-event-file-result.json" } - } + }, + "start_block": 113310, + "end_block": 113315, + "expire_after_occurrence": 5 } } } \ No newline at end of file diff --git a/automate/script/stacks-predicates/stx-event/stx-event-post.json b/automate/tests/stacks-predicates/stx-event/stx-event-post.json similarity index 73% rename from automate/script/stacks-predicates/stx-event/stx-event-post.json rename to automate/tests/stacks-predicates/stx-event/stx-event-post.json index c3ffb0553..f7757a486 100644 --- a/automate/script/stacks-predicates/stx-event/stx-event-post.json +++ b/automate/tests/stacks-predicates/stx-event/stx-event-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"0cc86353-7883-4fde-a1e6-42df78f0f6d6","name":"Stx event post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":211800,"if_this":{"scope":"stx_event","actions":["transfer","lock"]},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"0cc86353-7883-4fde-a1e6-42df78f0f6d6","name":"Stx event post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":211800,"if_this":{"scope":"stx_event","actions":["transfer","lock"]},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/stx-event/stx-event.spec.ts b/automate/tests/stacks-predicates/stx-event/stx-event.spec.ts new file mode 100644 index 000000000..c3911e696 --- /dev/null +++ b/automate/tests/stacks-predicates/stx-event/stx-event.spec.ts @@ -0,0 +1,37 @@ +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; + +jest.setTimeout(30 * 60 * 1000); // 30 mins + +// TODO: Ask that the expire_after_occurrence: 1 does not work but in readme it says it work +describe("stx-event:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for STX Event"); + await stxEventFilePredicate(); + console.log("COMPLETED file-append predicate for STX Event"); + const result = await stxEventFileResult(); + expect(0).toEqual(1); + }); +}); + +const stxEventFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.stx_event_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.stx_event_file.command + ); + console.log(stderr); +}; + +const stxEventFileResult = async (): Promise => { + let fileContent = fs.readFileSync( + predicateCommands.stx_event_file.result_file, + "utf8" + ); + if (fileContent) { + fileContent = JSON.parse(fileContent); + } + return fileContent; +}; diff --git a/automate/script/stacks-predicates/transaction/transaction-file.result.json b/automate/tests/stacks-predicates/transaction/transaction-file-result.json similarity index 100% rename from automate/script/stacks-predicates/transaction/transaction-file.result.json rename to automate/tests/stacks-predicates/transaction/transaction-file-result.json diff --git a/automate/script/stacks-predicates/transaction/transaction-file.json b/automate/tests/stacks-predicates/transaction/transaction-file.json similarity index 72% rename from automate/script/stacks-predicates/transaction/transaction-file.json rename to automate/tests/stacks-predicates/transaction/transaction-file.json index 2005adfe5..60dfefb2a 100644 --- a/automate/script/stacks-predicates/transaction/transaction-file.json +++ b/automate/tests/stacks-predicates/transaction/transaction-file.json @@ -5,15 +5,15 @@ "version": 1, "networks": { "testnet": { - "start_block": 111750, - "end_block": 111850, + "start_block": 111779, + "end_block": 111781, "if_this": { "scope": "txid", "equals": "0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b" }, "then_that": { "file_append": { - "path": "script/stacks-predicates/transaction/transaction-file.result.json" + "path": "tests/stacks-predicates/transaction/transaction-file-result.json" } } } diff --git a/automate/script/stacks-predicates/transaction/transaction-post.json b/automate/tests/stacks-predicates/transaction/transaction-post.json similarity index 64% rename from automate/script/stacks-predicates/transaction/transaction-post.json rename to automate/tests/stacks-predicates/transaction/transaction-post.json index 9b1f5c0c3..a28ef2d5f 100644 --- a/automate/script/stacks-predicates/transaction/transaction-post.json +++ b/automate/tests/stacks-predicates/transaction/transaction-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"633ea892-e1e0-4f5a-bba2-63e18a4fc9b9","name":"transactions post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":111850,"if_this":{"scope":"txid","equals":"0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b"},"then_that":{"http_post":{"url":"https://webhook.site/db639532-0288-44e3-9add-1584af436d6d","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"633ea892-e1e0-4f5a-bba2-63e18a4fc9b9","name":"transactions post","version":1,"networks":{"testnet":{"start_block":111750,"end_block":111850,"if_this":{"scope":"txid","equals":"0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b"},"then_that":{"http_post":{"url":"https://8ad2-2405-201-200a-3191-75fe-9dba-108b-42b9.ngrok.io","authorization_header":""}}}}} \ No newline at end of file diff --git a/automate/tests/stacks-predicates/transaction/transaction.spec.ts b/automate/tests/stacks-predicates/transaction/transaction.spec.ts new file mode 100644 index 000000000..599697a43 --- /dev/null +++ b/automate/tests/stacks-predicates/transaction/transaction.spec.ts @@ -0,0 +1,50 @@ +import { getPOSTPage } from "../../utility/browser-instance"; +import predicateCommands from "../../stacks-predicates/predicate-commands.json"; +import { PostPageInstance } from "../../utility/post-page-instance"; + +import * as util from "util"; +import * as fs from "fs"; +import * as child_process from "child_process"; +const exec = util.promisify(child_process.exec); +const expectedTxId = "0x411e78f4b727fc0a78b86c3fd56da0c741c71339713be81d7528c4015665267b"; + +jest.setTimeout(45 * 60 * 1000); // 45 mins + +describe("Transaction:", () => { + it("file-append test", async () => { + console.log("EXECUTING file-append predicate for transaction"); + await transactionFilePredicate(); + console.log("COMPLETED file-append predicate for transaction"); + const result = await transactionFileResult(); + const actualTxId = result.apply[0]?.transactions[0]?.transaction_identifier.hash; + expect(actualTxId).toEqual(expectedTxId); + }); + + it("post test", async () => { + console.log("EXECUTING post predicate for transaction"); + const { stdout, stderr } = await exec(predicateCommands.transaction_post); + console.log(stderr); + console.log("COMPLETED post predicate for transaction"); + // get the POST page from the browser + const postPage: PostPageInstance = await getPOSTPage(); + const result = await postPage.getPOSTResult(); + const actualTxId = result.apply[0]?.transactions[0]?.transaction_identifier.hash; + expect(actualTxId).toEqual(expectedTxId); + await postPage.closeBrowser(); + }); +}); + +const transactionFilePredicate = async (): Promise => { + fs.writeFileSync(predicateCommands.transaction_file.result_file, ""); + const { stdout, stderr } = await exec( + predicateCommands.transaction_file.command + ); + console.log(stderr); +}; + +const transactionFileResult = async (): Promise => { + const fileContent = JSON.parse( + fs.readFileSync(predicateCommands.transaction_file.result_file, "utf8") + ); + return fileContent; +}; diff --git a/automate/tests/tsconfig.json b/automate/tests/tsconfig.json new file mode 100644 index 000000000..acae555ba --- /dev/null +++ b/automate/tests/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "target": "ES2019", + "noEmit": true, + "rootDir": "../", + "esModuleInterop": true + }, + "include": [ + "./**/*", + "../node_modules/@types/node/globals.d.ts" + ] +} diff --git a/automate/tests/utility/browser-instance.ts b/automate/tests/utility/browser-instance.ts new file mode 100644 index 000000000..d85d23ab9 --- /dev/null +++ b/automate/tests/utility/browser-instance.ts @@ -0,0 +1,40 @@ +import { chromium, ChromiumBrowserContext } from "playwright"; +import { PostPageInstance } from "../utility/post-page-instance"; +import { promisify } from "util"; +import { mkdtemp } from "fs"; +import { join } from "path"; +import { tmpdir } from "os"; +import { wait } from "../utility/utils"; +import { NGROK_DASHBOARD } from "../mocks"; + +const makeTmpDir = promisify(mkdtemp); + +export async function setupBrowser() { + const launchArgs: string[] = [ + `--no-sandbox`, + ]; + + const tmpDir = await makeTmpDir(join(tmpdir(), "ext-data-")); + const context = (await chromium.launchPersistentContext(tmpDir, { + args: launchArgs, + headless: false, + slowMo: 100, + })) as ChromiumBrowserContext; + await context.grantPermissions(["clipboard-read"]); + return { + context, + }; +} +type Await = T extends PromiseLike ? U : T; + +export type BrowserDriver = Await>; + +export async function getPOSTPage() { + // First initialize a chromium browser where we can load our pages + let browser = await setupBrowser(); + // Added some random wait time to make sure the browser is loaded fully + await wait(3000); + // once we have loaded browser then load the post URL + const postPage: PostPageInstance = await PostPageInstance.setupPage(browser, NGROK_DASHBOARD); + return postPage; +} \ No newline at end of file diff --git a/automate/tests/utility/post-page-instance.ts b/automate/tests/utility/post-page-instance.ts new file mode 100644 index 000000000..d4b9cb0a4 --- /dev/null +++ b/automate/tests/utility/post-page-instance.ts @@ -0,0 +1,57 @@ +import { Page } from "playwright-core"; +import { BrowserDriver } from "./browser-instance"; +import { + idSelector, + textSelector, +} from "./utils"; +import { PostPageSelectors } from "../selectors/postPage.selectors"; + +const selectors = { + $request: idSelector(PostPageSelectors.Request), + $requestTab2: idSelector(PostPageSelectors.RequestTab2), + $requestPane2: idSelector(PostPageSelectors.RequestPane2), + $clearRequest: textSelector(PostPageSelectors.ClearRequest), +} + +export class PostPageInstance { + page: Page; + browser: BrowserDriver; + + constructor(page: Page, browser: BrowserDriver) { + this.page = page; + this.browser = browser; + } + + static async setupPage(browser: BrowserDriver, url: string) { + const page: any = await browser.context.newPage(); + await page.goto(url); + page.on("pageerror", (event: { message: any }) => { + console.log("Error in loading page:", event.message); + }); + return new this(page, browser); + } + + async closeBrowser() { + await this.browser.context.close(); + } + + async clearPOSTResult() { + await this.page.click(selectors.$clearRequest); + } + + async getPOSTResult(): Promise { + await this.page.waitForSelector(selectors.$request); + await this.page.click(selectors.$requestTab2); + const content = await this.page.innerText(selectors.$requestPane2); + let parsedContent = {}; + if (content) { + try { + parsedContent = JSON.parse(content.split("Accept-Encoding: gzip")[1]); + } catch (e) { + console.log('Error parsing the response for POST result', e); + } + } + await this.clearPOSTResult(); + return parsedContent; + } +} diff --git a/automate/tests/utility/utils.ts b/automate/tests/utility/utils.ts new file mode 100644 index 000000000..77fc3a4b7 --- /dev/null +++ b/automate/tests/utility/utils.ts @@ -0,0 +1,23 @@ +export const wait = async (ms: number) => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(true); + }, ms); + }); +}; + +export function classSelector(name: T): string { + return `.${name}`; +} + +export function multiClassSelector(name: T): string { + return `.${name.split(' ').join('.')}`; +} + +export function idSelector(name: T): string { + return `[id="${name}"]`; +} + +export function textSelector(name: T): string { + return `text="${name}"`; +} \ No newline at end of file diff --git a/automate/tsconfig.json b/automate/tsconfig.json index aae154da0..f5ba5c3e5 100755 --- a/automate/tsconfig.json +++ b/automate/tsconfig.json @@ -1,14 +1,33 @@ { "compilerOptions": { - "target": "es5", + "target": "esnext", "module": "commonjs", - "lib": ["es6"], - "allowJs": true, - "outDir": "build", - "rootDir": "script", + "lib": ["dom", "dom.iterable", "esnext"], + "sourceMap": true, + "removeComments": true, + "noEmit": false, + "importHelpers": true, + "downlevelIteration": true, "strict": true, - "noImplicitAny": false, + "noImplicitAny": true, + "noImplicitThis": true, + "alwaysStrict": true, + "skipLibCheck": true, + "noUnusedLocals": false, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "baseUrl": "src", + "paths": { + "@tests/*": ["../tests/*"], + "@tests": ["../tests"] + }, + "allowSyntheticDefaultImports": true, "esModuleInterop": true, - "resolveJsonModule": true - } + "types": ["jest", "chrome"] + }, + "include": ["./tests/**/*"], + "exclude": [""] } diff --git a/tests/stacks-predicates/contract-call/contract-call-file-result.json b/tests/stacks-predicates/contract-call/contract-call-file-result.json new file mode 100644 index 000000000..2abea5d5c --- /dev/null +++ b/tests/stacks-predicates/contract-call/contract-call-file-result.json @@ -0,0 +1,464 @@ +{"apply":[{"block_identifier":{"hash":"0x9ceef75bceecdd434f07c598dbd8d9e809bb90b3ce9cf74e98b37e49b92ae54c","index":6743},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000025e9a118aa33c36a4e269ce8b669ad3fd43c4a3f29716dd70","index":2066214},"confirm_microblock_identifier":{"hash":"0x69440ef772fbe760a09a20fd3c179e4c521eb91b5db1d0e9fecf907a9c864739","index":5},"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":63,"stacks_block_hash":"0xb32bca4cae1caeb50fc186e866c9a2a02606e2f572700e7e5066db08daa55555"},"parent_block_identifier":{"hash":"0xc498f25ced5ee2a7eb1e16f926bb71d5916449e174d604b9ace5c288d78935f3","index":6742},"timestamp":1629969189,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x796179616d61)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":176,"kind":{"data":{"args":["0x627463","0x796179616d61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400fcfd305a42b985d50fafac05a1c413d25267d9a8000000000000000000000000000000b000007ea7ad624bb19308775f487f6371678ca6fe5736ccb58c5180236ac673f2e0ff28cebea37d82b1ae12e23091a05a825c9b0b570eed1891b24d649f3a9c8bb2db030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006796179616d61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000005f04686173680200000000086d657461646174610c00000004046e616d650200000006796179616d61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051afcfd305a42b985d50fafac05a1c413d25267d9a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3YFTC2T8AWRBN8FNYP0B8E42F954SYSN3MCCNW5","success":true},"operations":[],"transaction_identifier":{"hash":"0x2859f6b9508d08ec49cdda8ca451cae9d7439391564e51f88f891b3bf2eee48c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x796179616d61)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":176,"kind":{"data":{"args":["0x627463","0x796179616d61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400fcfd305a42b985d50fafac05a1c413d25267d9a8000000000000000100000000000000b00001c8f391cfc06f1a3511b7dd7bef3b91bbf8a53df86771af9f72ac9828aaee9f564f40692f7c8067c96cc71e21275361d06c81fd79e2de306538116f982a6ff37c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006796179616d61","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3YFTC2T8AWRBN8FNYP0B8E42F954SYSN3MCCNW5","success":false},"operations":[],"transaction_identifier":{"hash":"0x1d56d6ec7a9b4921f1ed9c923710aa969f4632a8f13e6a37edf88970bc33f3a0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x796179616d61)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":176,"kind":{"data":{"args":["0x627463","0x796179616d61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400fcfd305a42b985d50fafac05a1c413d25267d9a8000000000000000200000000000000b00001acb09ad7a7bf081448a7682e6b270e7f634675a13ac0f75c7f9ef6bdddbd74a60449e311aed756bfe9d9c82a67dc2fad4b11e195fd24b67ab8f7927e58ae7714030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006796179616d61","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3YFTC2T8AWRBN8FNYP0B8E42F954SYSN3MCCNW5","success":false},"operations":[],"transaction_identifier":{"hash":"0x7ebd689ccdc540fddf8f03b52d3dfd7816c17e047d2feb6a538b9310faad3f4c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x796179616d61)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":176,"kind":{"data":{"args":["0x627463","0x796179616d61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400fcfd305a42b985d50fafac05a1c413d25267d9a8000000000000000300000000000000b000000f8d911ee6ff8145a75aef4122ab759ad798d01f556d5da7bc8d1cb3448d1a8d50cf27f6f33acd0dd5820e482a84e97813677037992b58bfa870a2d8ea1ab83f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006796179616d61","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3YFTC2T8AWRBN8FNYP0B8E42F954SYSN3MCCNW5","success":false},"operations":[],"transaction_identifier":{"hash":"0xbf359afb1ee14dff0a22b5f70b60f536941a0c2230c7f477497b4fe353310847"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x796179616d61)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":176,"kind":{"data":{"args":["0x627463","0x796179616d61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":8},"proof":null,"raw_tx":"0x80800000000400fcfd305a42b985d50fafac05a1c413d25267d9a8000000000000000400000000000000b00001313d587620a0d09bd83fb9284cb9caef5552a0303d7c3c9f76fa11f4eeeb067e7d3219602db95833d71aad5b938d2f8aa531f787760d56d78f6d777ec8212ef4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006796179616d61","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3YFTC2T8AWRBN8FNYP0B8E42F954SYSN3MCCNW5","success":false},"operations":[],"transaction_identifier":{"hash":"0xbdcd25c5670dd8f02eebcd04fa641db98e797e6095fc4980d99849f112e78f3b"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f6c6f6c)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61227000,"write_count":2,"write_length":334},"fee":175,"kind":{"data":{"args":["0x627463","0x6c6f6c6f6c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":9},"proof":null,"raw_tx":"0x80800000000400d4a40185a933603095d3e6e269b5064d786d2a0e000000000000000400000000000000af00008b5b2aa19076f790067ee182a87260c4552d72a5c191edeafb403a8d31aa780d309725d492aa88251edca33da3674a1701ee7155ebd17cc335ad1f7f4caf96df030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056c6f6c6f6c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006004686173680200000000086d657461646174610c00000004046e616d6502000000056c6f6c6f6c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad4a40185a933603095d3e6e269b5064d786d2a0e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3AA80C5N4SP0C4NTFKE4TDN0S6QGV9A1S7GP9CG","success":true},"operations":[],"transaction_identifier":{"hash":"0x7e330b92c81a3cdff7f2588a04925603f29f9b16420aec8ee6a9fef76604624e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x09035970c01fa44ab898780a2f892569a344f3393b95c8a42e1de90bd637425b","index":6744},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001cec1594b9e52a3a6e10b60b9542ae71f4140385cc0e83a3c3","index":2066215},"confirm_microblock_identifier":{"hash":"0x256d3ad83ad4b8a0e894351e151b5b25f8c18f0788c0732dc4d1d780691b3a3f","index":1},"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":64,"stacks_block_hash":"0x2eb207998998ec7d741dea021e6a5bef84db588bbd446f80f51cb95ffdd38ac4"},"parent_block_identifier":{"hash":"0x9ceef75bceecdd434f07c598dbd8d9e809bb90b3ce9cf74e98b37e49b92ae54c","index":6743},"timestamp":1629969720,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f6c6f6c)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55505000,"write_count":0,"write_length":0},"fee":175,"kind":{"data":{"args":["0x627463","0x6c6f6c6f6c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d4a40185a933603095d3e6e269b5064d786d2a0e000000000000000500000000000000af00006c5df7da10a196db8a20c4dbe2dbc6b6bd3a6c797eda1cf371002c3d140ebda500dd8abe486abbc7998f0e81b0b92fcacb287a94b832b2f6fb3530607fe65b92030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056c6f6c6f6c","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3AA80C5N4SP0C4NTFKE4TDN0S6QGV9A1S7GP9CG","success":false},"operations":[],"transaction_identifier":{"hash":"0xafa33f5bf90eb348c43c2cb061ffae4d90f6cadbb077d5f7b6141614e79b3f86"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4b5334193a6bc8da164230bbe56974ea4e09afff5e66e4f4499fb31240a17c88","index":6746},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000077ef61264a549a120ac91e1497a767e6785fa5e5a2dcaca97b8f0f08","index":2066217},"confirm_microblock_identifier":null,"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":66,"stacks_block_hash":"0x6b48537008a0740c6a14cce9744de5d082aa6ede048936e93e40ec84d93d3a6f"},"parent_block_identifier":{"hash":"0x775647db656a8662c59adb9cbcf5782cc19a90c840fb3625e6294f09fa446150","index":6745},"timestamp":1629970312,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65727361)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":176,"kind":{"data":{"args":["0x627463","0x756d65727361"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400794c00db9b4ccdc0f4fce2020a9c634b3667b453000000000000000400000000000000b0000141c51df44b0309657296105dc0d0dd5f41e6a834b3339d810a01a499c0391003482781efdf0e86d94db3cfccec5fcfb8332f0b2e83004de0692968ce9562d9fc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65727361","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006104686173680200000000086d657461646174610c00000004046e616d650200000006756d65727361096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a794c00db9b4ccdc0f4fce2020a9c634b3667b453","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1WMR06VKD6CVG7MZKH042MWCD5KCSXMAFW99KSE","success":true},"operations":[],"transaction_identifier":{"hash":"0xed0eb846c4f2fe11b605c7b1484290af0035ee3d1f8f24d365c83a9ed2d79435"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65727361)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":176,"kind":{"data":{"args":["0x627463","0x756d65727361"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400794c00db9b4ccdc0f4fce2020a9c634b3667b453000000000000000500000000000000b0000064c6f6a17af45f062ff5fb13cf87cf2c34effc5ad333cb3d12361603ca91e4a0556b71f7623daf74fce05e1321a81e1c1d7e44de5c0adda4ee9c89ace5ac4ae2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65727361","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1WMR06VKD6CVG7MZKH042MWCD5KCSXMAFW99KSE","success":false},"operations":[],"transaction_identifier":{"hash":"0x62a704fa4d720362dc23ef4fff4b6474699a7239c00e624149c9d21daf67025a"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d6572)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61216000,"write_count":2,"write_length":334},"fee":174,"kind":{"data":{"args":["0x627463","0x756d6572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d23ce003a20b782bb05fc86f722cfebc41c5930c000000000000000700000000000000ae000126676b8599bc604478fffbe16fa87aacab11935f3ca45974087ef5d1c1e39cf438be138426944ccbea8ca64a126025b76e700803302c14057ea5d6254a6752e6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000004756d6572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006204686173680200000000086d657461646174610c00000004046e616d650200000004756d6572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad23ce003a20b782bb05fc86f722cfebc41c5930c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST393SR03M85QGAXGBZ46YWHCZTY43HCK1GQA2N7N","success":true},"operations":[],"transaction_identifier":{"hash":"0x1d76c385ae3b05051c5414ae0eee22ed6303e095691f05614e19632d6e783388"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x220e598897ba746f3dc8cab791f06661e0afb68c90696396b51630d497c14b3e","index":6762},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000ac2cb64e9bba6136f10432e68b58d14f5765a5c9ffc5e66bd54c89","index":2066233},"confirm_microblock_identifier":{"hash":"0x09736f66c4de6f1cfdc8888bc42f61fc1cee60d308952720ac28899596f595b0","index":3},"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":82,"stacks_block_hash":"0xd6dc53c660641502e593e4cdd66292b61ad26cf5942ea46840eb8e97331544e4"},"parent_block_identifier":{"hash":"0x8e668ae2ef562d87c1c64863d4de604bf3b19bca07963f9361fdf761b7d049f3","index":6761},"timestamp":1629983298,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x686968656c6c6f6869)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61271000,"write_count":2,"write_length":334},"fee":179,"kind":{"data":{"args":["0x627463","0x686968656c6c6f6869"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400501405c7129ee924fe05719bcf6ceb849a3dc2ff000000000000000700000000000000b3000067fcd0a682410e28aaf8c0c9c6e4a554368367f372c2b2040a69256a10dbd0114d8bfc56b5007362736874d680b628ebf64907da5dd2a471f552e547d90062de030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009686968656c6c6f6869","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006404686173680200000000086d657461646174610c00000004046e616d650200000009686968656c6c6f6869096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a501405c7129ee924fe05719bcf6ceb849a3dc2ff","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18181E72AFEJ97Y0NRSQKVCXE29MFE2ZYV8Q89B","success":true},"operations":[],"transaction_identifier":{"hash":"0x82bb0ed200034ab1d7d62f047148aab5d084c5012b7a68eb84d4dc9a6e5b6220"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf1d19fe7bd87b212196bc4acbe31aa8b3342ce88bef2d60c5bab9490a8a30723","index":6763},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001fb77bc5837f212f8a18db1978525f69507df834b752ca93a8","index":2066234},"confirm_microblock_identifier":{"hash":"0xebe6095aaa6dabd3e31d0aacba16fe6052ec3b8fd2a3a2ee23435ca179869e62","index":0},"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":83,"stacks_block_hash":"0xc25dcfc3384910e91f2fb9e5bb6e55fda3c3e22dca30eb45888e94b3ec1c5870"},"parent_block_identifier":{"hash":"0x220e598897ba746f3dc8cab791f06661e0afb68c90696396b51630d497c14b3e","index":6762},"timestamp":1629984504,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x686968656c6c6f6869)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55533000,"write_count":0,"write_length":0},"fee":179,"kind":{"data":{"args":["0x627463","0x686968656c6c6f6869"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400501405c7129ee924fe05719bcf6ceb849a3dc2ff000000000000000800000000000000b300007d1616507aa8de677d35c85f1a80b1a0d8b18ed9ed6d5880ece272620be89ded21b808b1583f17193ce3cba18eba09b294e137af3072c89315d99234fc55fcac030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009686968656c6c6f6869","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST18181E72AFEJ97Y0NRSQKVCXE29MFE2ZYV8Q89B","success":false},"operations":[],"transaction_identifier":{"hash":"0xa3c6e71bf9f660a01121e63989081f336119aac0fbc85161a9b3752c87d18aa1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc4f58bf5bccada0433f1002f044307a03308c3945db7a63e60b8b224347be2e5","index":6767},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000079cb3d9d2c887e863cde1a1975014851ff1814b711e633337b653acd","index":2066238},"confirm_microblock_identifier":{"hash":"0x3f7a6b276357b6b7287577e5427706c586810a05973f71dc070f98f4db6c1fe0","index":2},"pox_cycle_index":63,"pox_cycle_length":1050,"pox_cycle_position":87,"stacks_block_hash":"0x7bbee432fbc27b26e7f9856f0196ba7aeae52e7b17020ae6afd0144685dfc91b"},"parent_block_identifier":{"hash":"0x011739eb2fd1c862dc1921e50a7d583c9d53a08e13227f8de79e747d139ef785","index":6766},"timestamp":1629985391,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657231)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61227000,"write_count":2,"write_length":334},"fee":175,"kind":{"data":{"args":["0x627463","0x756d657231"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400888d39c2fa6716db5f5aeef61d790d94b726322f000000000000000200000000000000af000103d5f8d6b25a64b366f7a97b722f470f3a084edfdfb29d678c17b3101f1eac5f57bac7769b0685f9e57ea153eb358f02a5e0b8b4eaf7aab0ccc70506883a89b3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005756d657231","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006504686173680200000000086d657461646174610c00000004046e616d650200000005756d657231096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a888d39c2fa6716db5f5aeef61d790d94b726322f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST248TEE2Z9KHDPTZBBQFC7BS1PABE9HJ5WEQVMNB","success":true},"operations":[],"transaction_identifier":{"hash":"0xb0e835df8fe800e1e30877ed916309054432450b8b11586bd7e054e99684b24e"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657231)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55505000,"write_count":0,"write_length":0},"fee":175,"kind":{"data":{"args":["0x627463","0x756d657231"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400888d39c2fa6716db5f5aeef61d790d94b726322f000000000000000300000000000000af0001c36111233999adc0d6b0bf21f0d582f67da1fc8f881f3470b3e5b8495a7702a203a13d53cb237c97346f5bf2b554c4f1df216b0c08c24b648cf267c8918ee650030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005756d657231","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST248TEE2Z9KHDPTZBBQFC7BS1PABE9HJ5WEQVMNB","success":false},"operations":[],"transaction_identifier":{"hash":"0xe2a9ecd2b072c61dd2cadf12291a01c1a95a94ffff462fd27ee4bfac92597fa7"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273616c65656d31)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61293000,"write_count":2,"write_length":334},"fee":181,"kind":{"data":{"args":["0x627463","0x756d657273616c65656d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400200c0db082f7a7c47709ad0d0c867e8a3cba15a7000000000000000200000000000000b50001b02ca3e496ee230e991ddcc8d5fb5080b08ed8a62ca51acd750a8e59debecdf843147fb9c29b0bc1b68bee5633828685cc978e620b2538b2cab8b9ffedaeb007030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b756d657273616c65656d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000006604686173680200000000086d657461646174610c00000004046e616d65020000000b756d657273616c65656d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a200c0db082f7a7c47709ad0d0c867e8a3cba15a7","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STG0R3DGGBVTFH3Q16PGT346FT53SEGNMX5KWDNN","success":true},"operations":[],"transaction_identifier":{"hash":"0xcacbe6ab83c6596905f272f92ba6080243f66c53dab42648cd12b0ff3546295a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x36e3ec97e3df62d046e1c3fb21f79ed770a5f2a2d4520075a8fe8384d493a17a","index":9473},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000296f86ca405880eb0d00de0779314000eeb00d64c68ff806b7","index":2091994},"confirm_microblock_identifier":{"hash":"0x53999854a1c494fd8db2f42caa7e958f889b16a990dd0ae9769e3d9ad9c859a1","index":4},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":643,"stacks_block_hash":"0xca6d7e1d11b076c4760060837521497736fb1728f01d22450ba1659516be8ca8"},"parent_block_identifier":{"hash":"0xd2ed20ba1955674939befdfb1b827de757fbb26e2620115b7dd40e3e567f6927","index":9472},"timestamp":1630948432,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65723133)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":70400,"kind":{"data":{"args":["0x627463","0x756d65723133"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400d23ce003a20b782bb05fc86f722cfebc41c5930c000000000000001000000000000113000000c9e2e450e15e22d42a0b7582a7947a211b7d0e94b0f1e91915ab7bd0a251fe4535537b27702979d6e078738535cfe53b13e981b0cb28e741bf32225c5c163565030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65723133","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000009a04686173680200000000086d657461646174610c00000004046e616d650200000006756d65723133096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad23ce003a20b782bb05fc86f722cfebc41c5930c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST393SR03M85QGAXGBZ46YWHCZTY43HCK1GQA2N7N","success":true},"operations":[],"transaction_identifier":{"hash":"0x7d407cb3ab95370528ec711f6d9eb368952f57a477131c8a4aea013b42e1c96f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe4a9ded5de3992dab21a406dadf999a5a1a02656707a01501110aac28ed6bed6","index":9474},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000036acd05a67df377361204d216b272088444118e54162583605","index":2091995},"confirm_microblock_identifier":null,"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":644,"stacks_block_hash":"0xcd7d4ce72b5fcd3a35e5d70109bb2be3bd785b4ac4087cd193b9f62eedcebd83"},"parent_block_identifier":{"hash":"0x36e3ec97e3df62d046e1c3fb21f79ed770a5f2a2d4520075a8fe8384d493a17a","index":9473},"timestamp":1630949090,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65723133)","execution_cost":{"read_count":12,"read_length":45592,"runtime":55512000,"write_count":0,"write_length":0},"fee":70400,"kind":{"data":{"args":["0x627463","0x756d65723133"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d23ce003a20b782bb05fc86f722cfebc41c5930c0000000000000011000000000001130000006b78a7df221881ba73eeb64ecb885c2f1adcfd7d97ac27acfc4481771437ca0d363d34aee6acf5841b7941efe4f3a8fbb6d5e8a87075df8ffccf3abcab757c09030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65723133","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST393SR03M85QGAXGBZ46YWHCZTY43HCK1GQA2N7N","success":false},"operations":[],"transaction_identifier":{"hash":"0x36eb89719c7d4f5830df1765cb2543fbdf93afe7435e9517a1365b1b9ac812f7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xaf726b2d1b83c818b57fa0028d7a9365a5870d95326ddfd51a2ba4524f3ac369","index":9476},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000d537ad215473f48feaf8b8c6d97f1d7df1bec61fbcdad9b2dc","index":2091997},"confirm_microblock_identifier":{"hash":"0x35f2f4608dc8387967fdaa3a2a418bd6bf7571069353c97bee2a705491f066b8","index":2},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":646,"stacks_block_hash":"0x33417939252c69cecf640d38ef95653b7623aa937d5ef6a840de62ffe7b1ea1f"},"parent_block_identifier":{"hash":"0xc971ae79763890bea2b7d8f9d3b04d81afa35ddd3ca978b481a98ec9a80da5c3","index":9475},"timestamp":1630949333,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65723330)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":70400,"kind":{"data":{"args":["0x627463","0x756d65723330"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d29d9b634827d60651420ea0071d778a0ee292190000000000000000000000000001130000011759bb81f3adb17cc713666bbd7e6f3e3c9a49b082630304aa4e07fdfc62015e11ab5cb00660f2db1e37c8e83553c2237bf179a1c5ba45ac1a3596cb99b1f618030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65723330","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000009b04686173680200000000086d657461646174610c00000004046e616d650200000006756d65723330096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad29d9b634827d60651420ea0071d778a0ee29219","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST399V6V390KXC1JH887A01RXEY50XRMJ37TZTDNZ","success":true},"operations":[],"transaction_identifier":{"hash":"0xbda6c04cbdd6171b6f6d1d340efa6dd135728c8cf20600e016e6e4bb534ecd59"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbf79e762813dcb0ba6b9390edb1c44417869d698bf1d1a53d488ffbe4eba5a39","index":9492},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000e1d2655a192608cecacb12af3bb4800834c166d7f1131d5389","index":2092014},"confirm_microblock_identifier":{"hash":"0xf5d11a2d4559183de17eae260fd294a6846970452847f8c909a4c8122e432d08","index":2},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":663,"stacks_block_hash":"0x6295dc5599cd51188ab7991ed325c06e59f74b1ecb01006ffb3303a0a59d4ce3"},"parent_block_identifier":{"hash":"0xae82fd269a9107007d58d4fee77eeb97fb0ef6dc74451102f05b0d5ce4c5b0e6","index":9491},"timestamp":1630955819,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65723337)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":70400,"kind":{"data":{"args":["0x627463","0x756d65723337"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a33be928b4e45b0aa54b08814312beaf9717b7b70000000000000002000000000001130000006ee8114a1d0b25c10407c03e754fcbb4d638acfc34a6987cb305e89d65385bd93f6d3953a7daab30d676b640c3a8fcf0e10acd018c2370b77b07ddc499b1e35e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65723337","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000009d04686173680200000000086d657461646174610c00000004046e616d650200000006756d65723337096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa33be928b4e45b0aa54b08814312beaf9717b7b7","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2HKQT98PKJ5P2N59C482GRJQTQSE5XQPZJFW93W","success":true},"operations":[],"transaction_identifier":{"hash":"0xd9bac460b3e68925544e5301ecaaf33512147fe13f306c105515b352f0e3af86"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x89295a3c84da6a20da837af37360f6009ce1ffa553c8a1290ca7cb9810eb34dc","index":9510},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000008f096abd17649c597c7cf14c3c5b508e2d1fe8b43aa6fe0640f30ad1","index":2092036},"confirm_microblock_identifier":{"hash":"0x5e4f11f82b27dcbb9f34181dad822fcdb7c309b6f37fb9aad88a7326acb675ef","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":685,"stacks_block_hash":"0x1b4d920574270ae7e83c3145e802d5e1d77c59b5095b81653efb30637b6b88ae"},"parent_block_identifier":{"hash":"0x5c0ec2f020907a13d17944681ab00794d4be886e29e41deecedd7e20f73ef08d","index":9509},"timestamp":1630962816,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65726e65773337)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61271000,"write_count":2,"write_length":334},"fee":71600,"kind":{"data":{"args":["0x627463","0x756d65726e65773337"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a33be928b4e45b0aa54b08814312beaf9717b7b7000000000000000500000000000117b00000f4722c63da1ef3cf4b6f118a84c999e8ae0292627e8f8aad8b4fb5dcaf5ca2b14135b52b6a8a15084acdc493a39f86f5e708a20cde2a48021c394232afd284cc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009756d65726e65773337","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000009f04686173680200000000086d657461646174610c00000004046e616d650200000009756d65726e65773337096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa33be928b4e45b0aa54b08814312beaf9717b7b7","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2HKQT98PKJ5P2N59C482GRJQTQSE5XQPZJFW93W","success":true},"operations":[],"transaction_identifier":{"hash":"0xa82014ca210596c36fce010cb0ce6fe2399a118e81a64f04a4fd7a33157599f7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe868de04b2d981415b269b07c8f1499721dbbffa8d1d23472c96cc14651d8270","index":9621},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000b618a0552fc91d43ec4e76c0f887bc1a2c7990a30bcb6477f3","index":2092168},"confirm_microblock_identifier":{"hash":"0xecd8c4b4df70e6f13350d5a9c67260e64c34632a6790f974a6f3d18bef73bf52","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":817,"stacks_block_hash":"0xcb275b9a834ef8f5b3cb695b66f0b3efb67af4992a3d3a5d934a9934e10df7ed"},"parent_block_identifier":{"hash":"0x43594b6b68e9934627ab5eea4611eb7e89d04d0f6bd972b415726c24417c2346","index":9620},"timestamp":1631008478,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657237)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61227000,"write_count":2,"write_length":334},"fee":70000,"kind":{"data":{"args":["0x627463","0x756d657237"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c925d99f98d8c2d8ddb673369891317980173969000000000000000200000000000111700001f43460f88135ff241ca465de3216b5640bb8663448e9a3882615ddf3f58793282018faca07729d6c5655057c7c456532af7297bb99538d98173a597cc7d40f2c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005756d657237","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000a104686173680200000000086d657461646174610c00000004046e616d650200000005756d657237096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac925d99f98d8c2d8ddb673369891317980173969","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST34JBPCZK3CC5P6XPSSKD64H65WR05SSD7R7BF89","success":true},"operations":[],"transaction_identifier":{"hash":"0x46eda9a31f3c2b338f94884e12fe0c3b300a22a88296b95f83895e37743c9b68"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa26c4b12788b7aea653ffdabfff1d8a8fd199e4e2c00cfd55555e6eff9cfc1f2","index":9623},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000d027dcb28513237867ad91a912ed161c9ad14244344605193f","index":2092171},"confirm_microblock_identifier":{"hash":"0x47d19b3a9dae787e926811d235c3e44721d8e86110bc0f50ab99d6868ebd3732","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":820,"stacks_block_hash":"0xca8b1b0c7abb55d2f277b143e59f66147949a1ed4f94bf2586b7b2b702c58a22"},"parent_block_identifier":{"hash":"0x73180ab08886594c8e94a9cd3b2cbaddcf274f8fb4be83214e79b589c4620dc1","index":9622},"timestamp":1631009246,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d65723232)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61238000,"write_count":2,"write_length":334},"fee":70400,"kind":{"data":{"args":["0x627463","0x756d65723232"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":6},"proof":null,"raw_tx":"0x808000000004008c146292b43210c423e91fc4b85652f2f6a096e2000000000000000200000000000113000001cdebf58a8559c684d780d336cafb358927a1e820a40ad9248d000578614e82b02d9cd933f65be6db0afe0d9a77b3e89e8c26546536bfcdf1679dbe829a67d0b0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006756d65723232","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000a204686173680200000000086d657461646174610c00000004046e616d650200000006756d65723232096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8c146292b43210c423e91fc4b85652f2f6a096e2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2618RMJPGS11H13X4FW9E2PABSFD84PWADM6D5F","success":true},"operations":[],"transaction_identifier":{"hash":"0x362528c5f23728a3b617e6d1aff7d3f3baedfcbce87d20cda388343d27492591"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1153d91d678be2606e9e247737b0fa8bdaeb855182735386d56ac318c7ee40b0","index":9639},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000ae2c0b35ecf6833713f71bb54ed7e72c67f940244f8543fdbe","index":2092190},"confirm_microblock_identifier":{"hash":"0x6086a9089471d4d4063aba1a1e418ff52387d63ec25b77b22962be5f1eb6d0e3","index":1},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":839,"stacks_block_hash":"0x00fa53d09e2d18e5e0c0c9e6b039b8c4b52cf8e3042b1c8e355006447f82bd27"},"parent_block_identifier":{"hash":"0xc7a6b910c8d6ba3986539c80c6ac51c0094a177233be92c5eb60e06f23511696","index":9638},"timestamp":1631017380,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e673338)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d657273746167696e673338"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040087a7defc3beea1f2fbc764b5dc7b42e15d96da2200000000000000000000000000011df00000fdc99d1def42ca61ee419bccf3d59f174e8aac916b3125d0616ba4db578d89a91255a5d6fd39c489e74aaa216dc7a6001e73684181762bf27aa0e37e00eedeb1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d657273746167696e673338","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000a604686173680200000000086d657461646174610c00000004046e616d65020000000d756d657273746167696e673338096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a87a7defc3beea1f2fbc764b5dc7b42e15d96da22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST23TFQQW7FQA3WQVRXJBBQ3V8BGNV5PT4A156HKS","success":true},"operations":[],"transaction_identifier":{"hash":"0xeb771d047336e114be06d95f7b2e5922ce61d4ed96f75b8be0c8386e90fe9ce6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xee56be151942ac9b64ba059323f0bbb8d0528c523207cd78701af2a2d565ec31","index":9648},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000d16af525ef77b0a846997a85ece9c785b2e6e69c7428fcb35","index":2092199},"confirm_microblock_identifier":{"hash":"0xf3cd139a8fb68bce750fc31c47eeed9f5f365ccbb75ebcf17ee2bd64158a9dca","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":848,"stacks_block_hash":"0x094524931a606a0ad09ed57fb2122eae006ec436a7da110436feb455e47c93fe"},"parent_block_identifier":{"hash":"0xa65c47b3dc530bef779dc978eafd59f0a13ab0ca4270fc73860ee45b5dcb7924","index":9647},"timestamp":1631021778,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d6572333973746167696e67)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d6572333973746167696e67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400df17a530d22682df4ccbb0f1b228136188fea44d00000000000000020000000000011df00001c1da3b4d068725dd297e838eaad42a6acd6bd62e13ad49362794e48130b82aff5764b234db59c650217bc3ea9227eba38da00abf4ec49133a2a23d8e4f40f3e9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d6572333973746167696e67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000a804686173680200000000086d657461646174610c00000004046e616d65020000000d756d6572333973746167696e67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adf17a530d22682df4ccbb0f1b228136188fea44d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3FHF99GT8K85QTCSERF3CH82DGRHZN49M2X0605","success":true},"operations":[],"transaction_identifier":{"hash":"0x4bba9cb3d525ec8b6ec32f3dd379c74d13e8caab52c67b5c4286e22df03b68db"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9c1526bd0b122124a06a94edcc93551f7effa30c931a3b28d1e89e34457635b2","index":9652},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001d258832437821e80196a3abd4118c59c8cc80cdaa282632df","index":2092205},"confirm_microblock_identifier":{"hash":"0xfd3bd42dd1918b513fa0452556b4747fb51bb238fc7a41cb8ad78db990340b3c","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":854,"stacks_block_hash":"0x8daa60a8829c188d0c50eb6fe46c03b55ae6458a15351dd125df77eb0c440797"},"parent_block_identifier":{"hash":"0xa716b2b60e9318a325af572908904959d3b0eec0b722be59ead747de9ef3ddb5","index":9651},"timestamp":1631025402,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e673430)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d657273746167696e673430"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400bbc0a4da06f7b02f033da5a893ba81e492aac05a00000000000000000000000000011df000005b75e913e715e73327e87918dd98f60076ef8e40c06aa2d5695cbeda2c23af433de557e92edc1319e7bc34094d38c3be7147f1b3fb13e57e61dd63e3bbf80bf4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d657273746167696e673430","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000ab04686173680200000000086d657461646174610c00000004046e616d65020000000d756d657273746167696e673430096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051abbc0a4da06f7b02f033da5a893ba81e492aac05a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2XW196T0VVV0BR37PJTH4XTG7J95AP0B9X0DSYQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x37900fb569ecacc320d98a7f7a0a049a9c53c42096cfbbaffe7afbd335605b45"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1cdff9d1e0c65c2eb0cb2875d54d988088df5b510a2d29f184df6f5d9e326fbc","index":9659},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000863cfb27b07aeb9dcb26a9fc0e4a436beb2f5b6d4868d2aeff","index":2092215},"confirm_microblock_identifier":{"hash":"0xa42c7acf5e1268bd2901cb120d4d757ac8867af737c2fdf79439198963048e64","index":4},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":864,"stacks_block_hash":"0x8ec0a4743fa5414348ce89cf3f416b9620d4fc0217be6ab6e7550e57b0f593be"},"parent_block_identifier":{"hash":"0x2b7dadb619a3c69611c0a2b2e6c6d3203cdda14c338574925079e79f5e4d1bbe","index":9658},"timestamp":1631027863,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6577646f6d61696e)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61271000,"write_count":2,"write_length":334},"fee":71600,"kind":{"data":{"args":["0x627463","0x6e6577646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004002b30f2bdaedc01c755b6665d61ad1fa521dbac55000000000000000200000000000117b000004221914dc777cf24ef3beca916e093f7bd6fdfcc1d90dbc31c02cab7ce47a8655fd707a7cd73c59d99b7fc36c2ce4a45191d4dd51cd643bb464b01dd72768e94030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096e6577646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000ae04686173680200000000086d657461646174610c00000004046e616d6502000000096e6577646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2b30f2bdaedc01c755b6665d61ad1fa521dbac55","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STNK1WNXNVE03HTNPSK5TRDD3YJJ3PXCANYG1739","success":true},"operations":[],"transaction_identifier":{"hash":"0x0c494efc96ebd246c7b4968cc7ce86832491c2d37ea62740a60bbd99172a5530"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb468bf55a073c90e962dc6965937f92b0b1279330796e0b3ab9d93ba2698c7f1","index":9660},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000006178d2678d0e8a064203a55f12bf5a679b4029c187c215a17","index":2092216},"confirm_microblock_identifier":{"hash":"0xd04e729534ba2d3dff8a67bf6c4f4c05b36fc012cf7973eb134f82c67ddffd40","index":2},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":865,"stacks_block_hash":"0x7de2121a8c994d7cdc1e4f3d5ed6dc3f7847dff008614608d81b2f64ed24d97c"},"parent_block_identifier":{"hash":"0x1cdff9d1e0c65c2eb0cb2875d54d988088df5b510a2d29f184df6f5d9e326fbc","index":9659},"timestamp":1631028947,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e673432)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d657273746167696e673432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004009514db180fdc3c6fb83d7dce1b1a23db81f70fbe00000000000000000000000000011df00001f3f318c96794e09f7fcf5d495f821fd1f4141485010393d11fffe93b506ca5b25a62fbc0d7b940841a9471d149e284513814d4cbf4d132027f5a2f6a3216a364030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d657273746167696e673432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000b004686173680200000000086d657461646174610c00000004046e616d65020000000d756d657273746167696e673432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9514db180fdc3c6fb83d7dce1b1a23db81f70fbe","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AH9PRR1ZE3RVXR7NYWW6RT4FDR3XRFQT4QTY0J","success":true},"operations":[],"transaction_identifier":{"hash":"0xcdf2011aff6659a255f03293a1ce7e7b49d715809ec0e077807b13dbd5f80535"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xaea556ac72a3d97aab9af56ff03e3cec18390c34fcb53e084add13ec1e9c9304","index":9663},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000690aba778eef300ee0e3af7bbd218e7963b7a1c0c1b7d0256","index":2092219},"confirm_microblock_identifier":{"hash":"0xa764961d28041e4c4e42b8ccc5fa3d9a86c22a6821460f3df5dcc8d3fa76139d","index":1},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":868,"stacks_block_hash":"0x69df5cb2be3dfe273849c7a55eed352e876a34f7753e14eb5c819ffb8abe3491"},"parent_block_identifier":{"hash":"0x9f66311a813cfbdab6a875cced06a7ccfad5bed1b03df2a360bcb1b679f1fbcc","index":9662},"timestamp":1631030579,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656d6f646f6d61696e)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61282000,"write_count":2,"write_length":334},"fee":72000,"kind":{"data":{"args":["0x627463","0x64656d6f646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ab539d3f9b8831a5780a092ecb49d6d301484efd000000000000000200000000000119400001f26f0971bd02d8b257ea62318b6627cbdef607ea5f615dfd509359adf7b778ce1c6b51860e8308929f0cd0d5142ee85c77c36a49271c7da0615a66cd6db579ec030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a64656d6f646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000b304686173680200000000086d657461646174610c00000004046e616d65020000000a64656d6f646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aab539d3f9b8831a5780a092ecb49d6d301484efd","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2NN779ZKE4339BR184JXJT9TV9G2J2EZPZAEWB6","success":true},"operations":[],"transaction_identifier":{"hash":"0x8445a2e0e467bbe65caaea876c7eb34b983fe48d0f44b75c022fb4de3e725060"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x47d0020f4a41976576649b05cd538bdc2fcbc7f75574753144bf3917473aa437","index":9674},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000038d71f2bfc04c0dcf3f5d30cf36c9f0813b479dcef9bcd55","index":2092230},"confirm_microblock_identifier":{"hash":"0x9dd7c2e3276fd858b1b8086dd720c258d63f2672d0c58b1ebf1278a7c5c2ff47","index":3},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":879,"stacks_block_hash":"0x83f81ea35f6836c58ba749fc63a0975baefaf6200d63b3ac3dd3920ac372d131"},"parent_block_identifier":{"hash":"0x32ff82d1e560941799aaf27f39c216ad077ea49cffb826a18e493c22205fef68","index":9673},"timestamp":1631036044,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374726970657465737431)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61293000,"write_count":2,"write_length":334},"fee":72400,"kind":{"data":{"args":["0x627463","0x7374726970657465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040080e8e6bdf352a9128b9bfaa7be616216885a1c9000000000000000000000000000011ad000007d6c26302cfcc5f036b4212e8dfee8db0d2e04e79f6b97ce85a7115badc88cf6032619bf1659bd0c359f5f87015f932400130ad2f5d5af16cc3f6dd994ceb543030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7374726970657465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000b404686173680200000000086d657461646174610c00000004046e616d65020000000b7374726970657465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a80e8e6bdf352a9128b9bfaa7be616216885a1c90","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST20EHSNXYD9AJ4MBKFXAFFK1C8B8GPGWJ3MYT03G","success":true},"operations":[],"transaction_identifier":{"hash":"0x714b5ac2b63d0680760e5218a9db335bc6bfa14f75daa096b628ebda52441982"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xff6f0b4bfefee409ca12f2f176fc139f1aba750208ae057553d302c810af06db","index":9784},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000009323f7e573c99d6eeedb2159d9c85b659dc4b3abaed3f379de","index":2092349},"confirm_microblock_identifier":{"hash":"0x577ce4fda9264713f9f833e91967317ec15aa97f874d4a7d62254202ebbf1cd5","index":0},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":998,"stacks_block_hash":"0xdc46952e0c3aa1f9e6893405c4814e45a5aa4d9e18365a0b2ac63e9a187648ec"},"parent_block_identifier":{"hash":"0xf500ac77b4ec668706b352950b433bb02e64af6f195d295862572772c4712111","index":9783},"timestamp":1631090818,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e673434)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d657273746167696e673434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400bb99f46e4fbdd85cda86cb77e0884df00bf5246c00000000000000000000000000011df0000115005bafcb1c8a2ff6273f777d5f181ebb558a1e0280a603e34c26c3db4480d53081608fd4569528ad212983aaf767f128187bdaa2fa2b3e719817848980d7da030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d657273746167696e673434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000b904686173680200000000086d657461646174610c00000004046e616d65020000000d756d657273746167696e673434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051abb99f46e4fbdd85cda86cb77e0884df00bf5246c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2XSKX3E9YYXGQ6TGV5QFR489QR0QX94DJH1EWP7","success":true},"operations":[],"transaction_identifier":{"hash":"0x52aff757cebe2914b30a2df4965287cabf968d40fe819a96ef91d0cf3c94499b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3850d149a362a9778e7f1c03d61bc2084cee0b1d09ed1dbbfe914704a14ea109","index":9804},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000090e2250c1e570fe24760ba3118dfd9af25f25c6b3c758fe496","index":2092372},"confirm_microblock_identifier":{"hash":"0xa7a30a17b470a115cae66d369a706f0a4e9a1555883fbb58aaf3d902740ffc9a","index":1},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":1021,"stacks_block_hash":"0xe81c73e6912f09075db6106a6782747ffd9afdaa1e6ca523fda5759328f09c08"},"parent_block_identifier":{"hash":"0xe551c292dfea6eb683a6920b4d7a5064a2170be95829895a98c96344ccb3af47","index":9803},"timestamp":1631099611,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f696e62617365726574657374)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61326000,"write_count":2,"write_length":334},"fee":73600,"kind":{"data":{"args":["0x627463","0x636f696e62617365726574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040048262f38bd1c955e073b88cb6f8f29d24d568dab00000000000000000000000000011f8000008bdbf49724573e6f8008e8e88cfec57cb10ad9a637d30d8737391810d66e00ac70c5a8925cdc4fd9163baf89cba4bf447925f9cf0c8f29b1a6b81c000750a6c6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e636f696e62617365726574657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000c404686173680200000000086d657461646174610c00000004046e616d65020000000e636f696e62617365726574657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a48262f38bd1c955e073b88cb6f8f29d24d568dab","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST142CBSRQME9AQG77E4CPVWF5794TNMDNDRJ4SY3","success":true},"operations":[],"transaction_identifier":{"hash":"0x7477958ab5b8e0d5a7d6e725f411cc2647fb91c702759a4a9858cf5974febfa3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7e8b4bd15e927fd0f33146f744f7281fe5e728d56b43b5f2c0fb6fde2c49d93b","index":9814},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000aa550a1ce7d8fc3d99818c794b02bb4d6f3e18e38682d934b2","index":2092384},"confirm_microblock_identifier":{"hash":"0xb410fa9c7b001183771381408dfda316c3665c714207388602880deea272eb3f","index":3},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":1033,"stacks_block_hash":"0x78f371fbb6a52042a788ff56cc1f1754bf783ad44009513c3cfed6d391c1a787"},"parent_block_identifier":{"hash":"0xfa350d44d339983060869c8eebf3cde23991aa74a5b37e048fa870929dcd8a3a","index":9813},"timestamp":1631103192,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e673437)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61315000,"write_count":2,"write_length":334},"fee":73200,"kind":{"data":{"args":["0x627463","0x756d657273746167696e673437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400d64d236c64e03ace122efedd6f844f7f5175243e00000000000000000000000000011df00000cbbb3130bfd831f3ca7f8df4e0e1cf1615b5ce5d638b4d0a057c42643314f67a3b5c1642c196850a4d6f756133944abf65dd5a1294de54086e536cdf06ec5798030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d756d657273746167696e673437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000c704686173680200000000086d657461646174610c00000004046e616d65020000000d756d657273746167696e673437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad64d236c64e03ace122efedd6f844f7f5175243e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B4T8VCCKG3NKGJ5VZDTVW49XZN2X947VP2YW3Y","success":true},"operations":[],"transaction_identifier":{"hash":"0xdde0d7f8bb614535566c5c4e2f04b86d135ceec3bc53d2be3625494cd798c16a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x55fbdb91d7d750c3bde2df27d4329931aa601ca2ae660eab3094bec63e4c21b0","index":9826},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000b4a3528db0f1c4faefec973891bbe35f6d36a8625248e810fe","index":2092397},"confirm_microblock_identifier":{"hash":"0x468829ebfb899d5cea565a6ad520571b706187328f189ea347d1265a575d5cbb","index":3},"pox_cycle_index":87,"pox_cycle_length":1050,"pox_cycle_position":1046,"stacks_block_hash":"0xa882c66d2da0e75b9a1dc433c875d393f239386fab2b7f81e1987323af6a7825"},"parent_block_identifier":{"hash":"0xa500133223dc836d524673bf95b9fb5dcba7b4234656ce9608dc25ae4358b5c1","index":9825},"timestamp":1631108844,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f696e6261736574657374)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61304000,"write_count":2,"write_length":334},"fee":72800,"kind":{"data":{"args":["0x627463","0x636f696e6261736574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400ea321df3299242b261f285a8e120e5b3bb4dc11e00000000000000000000000000011c6000010aa3f1e9ef49b59355817979ba1f4d58afd87b84590e673e23faf9f8c4c04acb64127e9b9b485935881276807dce7bd05b4bc0463c0380553bb9e18e7830ec17030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c636f696e6261736574657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000cd04686173680200000000086d657461646174610c00000004046e616d65020000000c636f696e6261736574657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aea321df3299242b261f285a8e120e5b3bb4dc11e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3N347FK56945CK1YA2THR90WPSVPKE13R7WEJKE","success":true},"operations":[],"transaction_identifier":{"hash":"0x87325cf88d4388bb8d5e4a990000b55ca72562bd4d6d1f02a0c1c1ee5f858710"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb891c2eb2515c92cda801292b021fbf14975a8e27c1d0d0e2bbb740358b28f74","index":9969},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000d4790555e9ad3dd8c1984077895dcb7b015904296863cc5039","index":2092566},"confirm_microblock_identifier":{"hash":"0x88654a398cfb6981fef8fba1827148d49ba1572dc5eb536cc8ae98210b24a8cb","index":1},"pox_cycle_index":88,"pox_cycle_length":1050,"pox_cycle_position":165,"stacks_block_hash":"0xc93fb2ecf1e8b14ca28230f58d0add7eddeb3876509f84831156636d42abaf5d"},"parent_block_identifier":{"hash":"0x612b5116210b1cb36c7b1cf27237aaab60be2a288e1f373aabb5578ab1ef380a","index":9968},"timestamp":1631168394,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d6572636f696e62617365)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61304000,"write_count":2,"write_length":334},"fee":72800,"kind":{"data":{"args":["0x627463","0x756d6572636f696e62617365"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003853fded8fe038059bbecf67d2bcc97056d74ef900000000000000000000000000011c6000000b2920c5bf399de34c7367960d1867957e52d0138d8bf0eb13a26364a17ecaac1a84792380cc50ff42f97b615ac25ddf9cf05ee9b7af88104900a17cd17d6a9e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c756d6572636f696e62617365","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000d604686173680200000000086d657461646174610c00000004046e616d65020000000c756d6572636f696e62617365096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3853fded8fe038059bbecf67d2bcc97056d74ef9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STW57ZFDHZG3G1CVQV7PFMNWS5R5DNTEZ7ZX32ZB","success":true},"operations":[],"transaction_identifier":{"hash":"0x947e9bda71211a6d6007abd3e31779cf6610674860dabe849192a0f7956cfc8c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3ca7ba635b14e22fd649ae71cc0fa0e5a0ab0039944df1c9a52bb64b9ce39641","index":10036},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002a0a2c1ec44f2b59a89b5588ea3e84c19fcc245e4e231589ef","index":2092643},"confirm_microblock_identifier":{"hash":"0x2edbf80a951e70fd8697a5a6176b6232377cf5dfa05d03cf9fcf7e6ecead129c","index":1},"pox_cycle_index":88,"pox_cycle_length":1050,"pox_cycle_position":242,"stacks_block_hash":"0x9a60d96296fd68d0c16b38e98d99723ad1a6ed966982e0f2a66eaa4c8729ba18"},"parent_block_identifier":{"hash":"0x02f0e53899331c2a068194244fe0aacb6932b93c918a29e976d3eb0b9885965a","index":10035},"timestamp":1631185963,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x756d657273746167696e6734386e6577)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61348000,"write_count":2,"write_length":334},"fee":74400,"kind":{"data":{"args":["0x627463","0x756d657273746167696e6734386e6577"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040031e3a4935779f4380a80d2356cd9cacacd435c00000000000000000100000000000122a00001c566ef459223271193e8fb39cf8894ff400238be8f99cb24e6b64d0037ee88f1455c8acb640eb91576f06936e50fcd42b703362c4b42a07663af595aeaccc153030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000010756d657273746167696e6734386e6577","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000da04686173680200000000086d657461646174610c00000004046e616d650200000010756d657273746167696e6734386e6577096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a31e3a4935779f4380a80d2356cd9cacacd435c00","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STRY794KAXWZ8E0AG393AV6SSB5CTGTW01FEKH7A","success":true},"operations":[],"transaction_identifier":{"hash":"0x824dd84d488ff89b5e065b1cd99f5a51d4542a867d0847f62a526ad771b21920"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xff367340caf223c732652a2347b51f46d4faf9b73e38ce097f6a2a8d0258e598","index":11254},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000004ada67b882c021dbe41d8ca4893e833947c80027d40f07fc86","index":2094048},"confirm_microblock_identifier":{"hash":"0x8f324458b047684d4693191fcfe7bc026c66229c260a33c0e13dc9bafeef3c21","index":3},"pox_cycle_index":89,"pox_cycle_length":1050,"pox_cycle_position":597,"stacks_block_hash":"0x3a6066b14685ab0aac723df662fee8178f3524e14b929cf4e19fd1f42e9082f2"},"parent_block_identifier":{"hash":"0x594a25c8e96152496a26857550ff1289b5b9d35188a929ed1acec5245118c6be","index":11253},"timestamp":1631713692,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a61736a6a73)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61234025,"write_count":2,"write_length":334},"fee":70400,"kind":{"data":{"args":["0x627463","0x6a61736a6a73"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004002b926f4b7b725bc71c4f7f877f7f56465552158a0000000000000000000000000001130000011ac99b275a44838f511617f754aa37fe9a6056e1f9d87872f95f8156887174267d084289ac94734be4bcc62ec463e4f25a8322351f8281433c79a8dc22d6f54c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066a61736a6a73","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000000eb04686173680200000000086d657461646174610c00000004046e616d6502000000066a61736a6a73096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2b926f4b7b725bc71c4f7f877f7f56465552158a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STNS4VTBFDS5QHRW9XZREZVZAS35AMGNH8CWDRBE","success":true},"operations":[],"transaction_identifier":{"hash":"0x6aa4c2489a9a34b198078ad5db90c51034de401a510d3a71dfbf162770245e68"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd388e233cc620dd4576c6b06d9861ea05a24b2e5f9136217a3ae20a43ccb563c","index":12313},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002edb3c616fb02d181b90f9e520d6d0e31b455f90a874a18e0b","index":2095536},"confirm_microblock_identifier":{"hash":"0x8fdd5dad36edebb6b319b1fb103d8c721f39bc84a3cf429ac05c1abbc581e697","index":0},"pox_cycle_index":90,"pox_cycle_length":1050,"pox_cycle_position":1035,"stacks_block_hash":"0x9e60bfdc9403a17a96d3ce5c0d37dcf24e18dd37ef973482613d79234f9e0d20"},"parent_block_identifier":{"hash":"0xade76497e5234a5e71deb60e70e8a0b01c738908bee29bccab187d0ef5b5b958","index":12312},"timestamp":1632238156,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x70617061707061)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61245025,"write_count":2,"write_length":334},"fee":70800,"kind":{"data":{"args":["0x627463","0x70617061707061"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040068d2d8bcd1f5caecd939517c5005d85682edf314000000000000000100000000000114900000f0e5c7d265e3d81901e8b34734e1a67618f8417adc311fdd3afe5a30e4583e8c679202371fdb2bd0ad9ce4664c827829cf603148d053778b26dbb1ac3b293983030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000770617061707061","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000010604686173680200000000086d657461646174610c00000004046e616d65020000000770617061707061096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a68d2d8bcd1f5caecd939517c5005d85682edf314","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1MD5P5WT7TWNV6S758QRM05V1B85VFK2HEMEY90","success":true},"operations":[],"transaction_identifier":{"hash":"0xa2cbad4ed03e6dd73b8dafa94ffbab1381cacedbad7d3953b9f244c0dd1489a6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x496ef3cb9e1a66d496065d70daead08bd1df582341ce266e413a6cf1c0435679","index":16155},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000006a2c6fd2ac2459540b17edd413ad6b2d4a31fd860f4656c2f","index":2099789},"confirm_microblock_identifier":{"hash":"0x8ebfe552175a1d6d5368b9dfc3de931325834b4348248a8227b8ef2c5da271a4","index":4},"pox_cycle_index":95,"pox_cycle_length":1050,"pox_cycle_position":38,"stacks_block_hash":"0xc7593329321aedb37a4c4960c6a0111ad8dd2664725c865bfed1c8a434064fa7"},"parent_block_identifier":{"hash":"0x931f1c5065815aa2bd716bf50b0df95228611b61e8ad7779d68c6607097f6d5b","index":16154},"timestamp":1634672918,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x746573746163636f756e7433)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61300025,"write_count":2,"write_length":334},"fee":72800,"kind":{"data":{"args":["0x627463","0x746573746163636f756e7433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040029e9d758af03c3f25218cda6ef9562d7f9be12fb00000000000000050000000000011c600000040af91bfde34f06b6f2e81f2510abd03974ac668db789deb1df2fd66a8c075a51abd9ead5e8646805d333a731a44c193441ca8d66f31b385426298cfd1e8af6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c746573746163636f756e7433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000015104686173680200000000086d657461646174610c00000004046e616d65020000000c746573746163636f756e7433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a29e9d758af03c3f25218cda6ef9562d7f9be12fb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STMYKNTRNW1W7WJJ336TDVWNCBBZKFGJZDQQ375S","success":true},"operations":[],"transaction_identifier":{"hash":"0xe6ee0aae5f23eae018f083c1fa2af0374747e08d15223db0e801ae33cb681bad"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x791b147398ad2720142e9f61c8c177dfe1d1388b36faaccd09b73e57c0a7bc70","index":16419},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000b0317dc3ddd2d5c4cbf8289934947e82689b86610b9e7fef6","index":2100077},"confirm_microblock_identifier":{"hash":"0xa9dcddddb9d977cb16e0916187d616b4e87f4ca803244de5336c76bd71a97f7a","index":0},"pox_cycle_index":95,"pox_cycle_length":1050,"pox_cycle_position":326,"stacks_block_hash":"0x2e27982c6d368423b9ece7f2fcf72adc3c713dd583c62e95784328136d06a8e5"},"parent_block_identifier":{"hash":"0xe42bc537b573e03a1a990703664b9d5a7da9efc35721ebe18baa020d2844fba1","index":16418},"timestamp":1634855376,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6865686568)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61223025,"write_count":2,"write_length":334},"fee":70000,"kind":{"data":{"args":["0x627463","0x6865686568"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400236ab28a3839a202b29d790e03888dae7422ca5f0000000000000000000000000001117000017b5912bc31be12a4b23de1da5d311ffedf22aed58702df431404db1d2cfab7d925294cc6954d232eeedea7479018c1f137f8b6cbf88ff33885ea86c94e9a0811030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056865686568","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000015704686173680200000000086d657461646174610c00000004046e616d6502000000056865686568096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a236ab28a3839a202b29d790e03888dae7422ca5f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHPNCMA70WT40NJKNWGW0W8HPQ788PABYWKNFE3","success":true},"operations":[],"transaction_identifier":{"hash":"0x27d59a5e013a20d39ffe75671ad3fa6cff3cde2f0e0d1811bb3fed087b57129a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x08ebbd8517f5eb9871927c1a1696ccbed00e75a8af9e6aca5ac79060b4f9a29e","index":20040},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002bea5d17dd640dcd13a28e64fa8b894af781ba071c98c0594b","index":2104191},"confirm_microblock_identifier":{"hash":"0x175d2ed682e9769b7c22b6b73c0c4bc651bdbffb757e045d42debe5e0e9c2ce3","index":4},"pox_cycle_index":99,"pox_cycle_length":1050,"pox_cycle_position":240,"stacks_block_hash":"0x08a74922af0921dd921a3e045c0b3a87650ddde8a8b920a42dfc15cce863fbfd"},"parent_block_identifier":{"hash":"0x528b81e292778230b221782aa6cc8cffb09b05409e8d0987152b87d98cf44d19","index":20039},"timestamp":1637074896,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x68656c6c6f)","execution_cost":{"read_count":16,"read_length":45611,"runtime":61223025,"write_count":2,"write_length":334},"fee":70000,"kind":{"data":{"args":["0x627463","0x68656c6c6f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400ec255bc2e99490d882c1a69dbd0c0b13953709ad000000000000000200000000000111700001f21ddc298942e3d2f99d24b9f0214097ea1c69cb1ebf7417843695472f45d4472db1c805b9354af939d5ffa8631d7822f819cea8bf889f54a71a88200296b880030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000568656c6c6f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000019704686173680200000000086d657461646174610c00000004046e616d65020000000568656c6c6f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aec255bc2e99490d882c1a69dbd0c0b13953709ad","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3P2APY2X6A91P42R6K9VF8C1C9SADR9NPFA4PDG","success":true},"operations":[],"transaction_identifier":{"hash":"0xf7d9aa7e86e9f567f602d5e33429f01723db83a6b4e0558b08de4860331cc26d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xda0d16e7d617c89683c5125cce6075f84941e8d34fc443bb003303f6d0c3ce77","index":29985},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000383ffb1adac065b853b728713b7fc4c741436b6c677a3e7c6590","index":2138042},"confirm_microblock_identifier":{"hash":"0x55cdeaaa1363ab3b3d6bccdefe8cf07d13df29e38fb694bac8755db33a0b6660","index":3},"pox_cycle_index":131,"pox_cycle_length":1050,"pox_cycle_position":491,"stacks_block_hash":"0x21358c06b8b661ba39a896cb64c25d7a2816a3edcdf73054811eadbd86db8ec8"},"parent_block_identifier":{"hash":"0xbcd1b410afc8d6f32ff3fad4b92c30735e56d1e96d2d47b77ceaba79c7c2e1a0","index":29984},"timestamp":1643456833,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737462696c616c3835)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":72400,"kind":{"data":{"args":["0x627463","0x7465737462696c616c3835"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400b4bdbf5fc069efbc417e0a6e9ffe0ec17c170fab00000000000000000000000000011ad00001e78e00addf5fd4b8caf61204062b7e96a9f93db6d8667a5e017f84337b661ccc2a457866f894dfe8d4d7d5bc51fda1ccaab0e36b9dbed630056062e8039a8e5f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7465737462696c616c3835","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000023504686173680200000000086d657461646174610c00000004046e616d65020000000b7465737462696c616c3835096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab4bdbf5fc069efbc417e0a6e9ffe0ec17c170fab","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2TBVFTZR1MYZF21FR56X7ZY1V0QR5RFNC32HF4R","success":true},"operations":[],"transaction_identifier":{"hash":"0x04a75ca3e7cc6a67747b634a6cc59b0692dca009270598ab6b027795d1d780ec"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6f03e793d7bb6a0fb44adc89316e5e4052065d287988abd76738fd0442f7f225","index":29986},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000b1331bcedffa21de782ab5abab7d45d50a05d6d258bf837ab4","index":2138043},"confirm_microblock_identifier":{"hash":"0x5b145600b8be531232bb838e85807c1ec8b02b8adfcb62955e9d67f0e70998e6","index":0},"pox_cycle_index":131,"pox_cycle_length":1050,"pox_cycle_position":492,"stacks_block_hash":"0x68f8ca2e012ba41467731c32e8da924de8f7c9dbb46f8afb81b3785396f8b5d6"},"parent_block_identifier":{"hash":"0xda0d16e7d617c89683c5125cce6075f84941e8d34fc443bb003303f6d0c3ce77","index":29985},"timestamp":1643458042,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374696e6762696c616c3834)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":73600,"kind":{"data":{"args":["0x627463","0x74657374696e6762696c616c3834"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003b98ca271f300cd36d3aee17ff6891e2acae8e9d00000000000000000000000000011f8000006efa556c744af4af5cbd774af9c5b1faf348dc033281d849b92a30d815cfd64d40ef51b752c66303697b8088124e0c744e8d47387f5cd43eaa8f20cb79d67e68030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e74657374696e6762696c616c3834","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000023604686173680200000000086d657461646174610c00000004046e616d65020000000e74657374696e6762696c616c3834096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3b98ca271f300cd36d3aee17ff6891e2acae8e9d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STXSHJH73WR0SMVD7BQ1FZV8J7HASBMEKMX0M8AE","success":true},"operations":[],"transaction_identifier":{"hash":"0x2d7666f5209fc9401d28101414d1e75fde3c9affcef90266cd0d65997217d5f8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7fc615cf542b958a50368a151ff9dce7179bfb4f641cab637981bf061507843f","index":30223},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000094c6bbbba9adc75cc59992a6f21b54018868001249a668cd97","index":2138290},"confirm_microblock_identifier":{"hash":"0x0b1d0487f302186fdcfc17bec6fbbd7d65d95194921def6491b6b2f3928d7b45","index":1},"pox_cycle_index":131,"pox_cycle_length":1050,"pox_cycle_position":739,"stacks_block_hash":"0x863418ea5113aacad48cac688a4fa5a64bcff3c614a007b5be9aae81a817d181"},"parent_block_identifier":{"hash":"0xf3f69957060775a664ed91a1e5484d50d1a660467c03765139311cd4b4734906","index":30222},"timestamp":1643646618,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374696e6762696c616c3436)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":750000,"kind":{"data":{"args":["0x627463","0x74657374696e6762696c616c3436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000447274a66ab6edcb358974a90be044410a67691000000000000000200000000000b71b000019949bd1c2a61735b7c96f453eaec426ebb6cde531098bc83f98c4ff6b35cad537613487d3fd3462f85f50e8f087932c01aeef44156ed0043a5c1c0d1f572a380030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e74657374696e6762696c616c3436","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000023b04686173680200000000086d657461646174610c00000004046e616d65020000000e74657374696e6762696c616c3436096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0447274a66ab6edcb358974a90be044410a67691","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST24E9TACTNPXQ5KB2BMN45Y0H2119KPJ4RBWQJ0","success":true},"operations":[],"transaction_identifier":{"hash":"0xc2f26f1f0bec5d030338d461fcfb72069f40564ffcb7a02171becb07f8f606ec"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374696e6762696c616c3436)","execution_cost":{"read_count":12,"read_length":43993,"runtime":132016,"write_count":0,"write_length":0},"fee":750000,"kind":{"data":{"args":["0x627463","0x74657374696e6762696c616c3436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004000447274a66ab6edcb358974a90be044410a67691000000000000000300000000000b71b00001b48d23b85318d9687490d2249659853e840bb3f0b2e57a45b391645f91796dd34708860a35d5a63ac99c8c154b342703e8806f7c75e7a3056a293b95c522bf45030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e74657374696e6762696c616c3436","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST24E9TACTNPXQ5KB2BMN45Y0H2119KPJ4RBWQJ0","success":false},"operations":[],"transaction_identifier":{"hash":"0x91a9168b180d450d46363515764fd9070281546693e87d8df8328cb1bb27eb22"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb7503cbdd32fdb9ecc7279f98e2faba0e8f37ce2d959ddb61570fc08643a01a7","index":30778},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000030e2da0dc40d768c2b3f6cd44531f7e8014a6035ad73ca57e4","index":2138952},"confirm_microblock_identifier":{"hash":"0x8d3dd9bb260b53b0ce232bf0e3c7c40972440a1507edd4f02596ad2109d47bf9","index":4},"pox_cycle_index":132,"pox_cycle_length":1050,"pox_cycle_position":351,"stacks_block_hash":"0x65937d5d2f86cea3f390c612c0e9d623e37b64bce2cd6461df2a24543c64e303"},"parent_block_identifier":{"hash":"0x01e7131774e3af9e0b5f7fed5b4a3865b1edfc8f933c6d96c819b67efca940fb","index":30777},"timestamp":1643900886,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737474786964)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":434193,"kind":{"data":{"args":["0x627463","0x7465737474786964"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400e0ded2c7651438b5cc18b977325200a1c9b427580000000000000004000000000006a0110000c1dd6d8fbf083c21a3094a31808451b13a86972e2f30cc0a9c5e102f700a0d516999147039a2c590079ccbd2eedade222a579bad0f66b7df4ecdddc1d5ed49c2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087465737474786964","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000024804686173680200000000086d657461646174610c00000004046e616d6502000000087465737474786964096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae0ded2c7651438b5cc18b977325200a1c9b42758","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GDXMP7CMA3HDEC32WQECJJ02GWKD17B2X4669E","success":true},"operations":[],"transaction_identifier":{"hash":"0x63b947ad48b4ff019bc368c3159c8a8a1ce820ac06ec51097e92853d37ab18ac"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdd8175d35c2ad436fa55bc81d12f86176127be8573dd606de050593b8caa5c10","index":35188},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000030f6c522844d5245fb68eaf00cdb9af5557086778c02ef9651f","index":2160517},"confirm_microblock_identifier":{"hash":"0x04cec822830a93696ffb2be117fa675bc3347d447737ad6bcbfbe3d27ab3616c","index":0},"pox_cycle_index":152,"pox_cycle_length":1050,"pox_cycle_position":916,"stacks_block_hash":"0xbf0e3b66ec085b46d3495e160c18773a5142ee3531fcf779966b1171405fa578"},"parent_block_identifier":{"hash":"0x080ab285354b2f178a2f3a3b7179284fe911c99bf2be879ecfcfeaba2a94507b","index":35187},"timestamp":1645104378,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465636865636b31)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":637953,"kind":{"data":{"args":["0x627463","0x64656c657465636865636b31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005dc5a5dc89637785b38215da3f3e7156546ac1bc0000000000000004000000000009bc010000b1ffc0d153b70005df349d6f07c6960e997bbfc0af09d8867eaa9e32170de86f41270d89bd7aaa50a1d791ff056a89289ad6b58c95bdcbf9db6026175f12096f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c64656c657465636865636b31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000026c04686173680200000000086d657461646174610c00000004046e616d65020000000c64656c657465636865636b31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5dc5a5dc89637785b38215da3f3e7156546ac1bc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EWB9EWH5HQF1DKG8AXMFSYE5B58TP1QJ4WBWP3","success":true},"operations":[],"transaction_identifier":{"hash":"0xaa04a80ec05ca38fefe9ce7470d1c697d33f2b7a3b6fae1ff44ff23023d66431"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1cc7627a2f71a02e1b957a8c68193ff1967ae1e37e6f962e4fab70cf8221d5eb","index":36972},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001238ff7fa5f84e32ff0dbee88a7b0d69cd87243fbac3f4a7f0","index":2163178},"confirm_microblock_identifier":{"hash":"0xc0b8d60bd29987ddb3f955fdcdb62fa43088d6d72fcd3f51844f995fa2ccef4f","index":1},"pox_cycle_index":155,"pox_cycle_length":1050,"pox_cycle_position":427,"stacks_block_hash":"0x88bc4ec3cf86d0cfff44152b2b827ae4641b4cdceab07094c662d2147619d7c6"},"parent_block_identifier":{"hash":"0x9239c1cde2694dea76a5e10f6e5b5b914a014252353813251e5fa0e6ccaf1ae3","index":36971},"timestamp":1645442425,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737462696c616c313139)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":2000000,"kind":{"data":{"args":["0x627463","0x7465737462696c616c313139"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003dbba8061faa6ec46bd51781220ed81384f5a5a1000000000000000000000000001e848000004aa673e11046d1ce082b577a5bdf91551ea2bd7b015e5679d98c4b64f2cbd1df647fd53a9346faed7569b9075706cdcfa96a3d301252c25bf2e5dcc7bded0973030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c7465737462696c616c313139","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000027304686173680200000000086d657461646174610c00000004046e616d65020000000c7465737462696c616c313139096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3dbba8061faa6ec46bd51781220ed81384f5a5a1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STYVQA063YN6XH3BTMBR28GEV09R9XD5M645C3VQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xadb6fbfb3d39eaa1baa08025c83aec2e782449714b004a8218e6a803cb23faa5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x129558247eff0f901cb38f51b5c3c35346487250e5b2c2da8c8d68c858910144","index":36980},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000025e325313849ee2deb81204f74f718f35fd3ec908741888618e","index":2163187},"confirm_microblock_identifier":{"hash":"0x57ff2f51ed7182bf48243664dc6257d9c69e6c66f689171e54db6e0845b3de8b","index":0},"pox_cycle_index":155,"pox_cycle_length":1050,"pox_cycle_position":436,"stacks_block_hash":"0x851d9816cafb4f280ed8d258db702ceb158fb96485a2a608cb8165d8143d95d2"},"parent_block_identifier":{"hash":"0xe8944faa007208b5303a62e0d430457a5beb77e31ab3de3d956f7426de208293","index":36979},"timestamp":1645448152,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465636865636b32)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":2000000,"kind":{"data":{"args":["0x627463","0x64656c657465636865636b32"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400620083b5f90c6144bf3af7af03b0451a92ed67f7000000000000000200000000001e848000006a0a6f5bf3502c5009b0ac77d0ffab01b1ec0ee960cc7124a0f94e781115631f0f5254796f9ddb19b068041f3d85b919e0c69b35115c9e224abce5a547986381030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c64656c657465636865636b32","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000027904686173680200000000086d657461646174610c00000004046e616d65020000000c64656c657465636865636b32096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a620083b5f90c6144bf3af7af03b0451a92ed67f7","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1H010XNZ4662H5Z7BVTY0XG8MD95VB7YW0SPDC4","success":true},"operations":[],"transaction_identifier":{"hash":"0x00178e6f8357b8334391af10b963cfaa207fdfd0d06c417a50705570ae0edd6c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8b3f10e62c0bdf587c7cd3709782115d27d21df11156caae2836a620473eecc0","index":37290},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000001aeed704bdef6ba2ebd75fc59f7f9fb474db5c94215f7df47ef","index":2163560},"confirm_microblock_identifier":{"hash":"0x14ec0ed4775f5478461389c8bf518629135260e51c06af79f80f20c685af5214","index":1},"pox_cycle_index":155,"pox_cycle_length":1050,"pox_cycle_position":809,"stacks_block_hash":"0xcdffc72a2629fd429940e43f3cedfa668a5b7530efca3fd166995c05d46e4065"},"parent_block_identifier":{"hash":"0x12b79c612aa39fa6b65ae0bf05a67991d2f9ca9b25849f96235e48014946f9e0","index":37289},"timestamp":1645693635,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465636865636b36)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":2000000,"kind":{"data":{"args":["0x627463","0x64656c657465636865636b36"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002d6176c98f425b90933198f0fa9be85d2971846a000000000000000200000000001e84800000ab5bc9f5b31ae6766e624a2ad50a215966236d88403afe494ba6d8919c9f568b57a4299896f9af02790cd1302c5480fa12af15f4fb33765aa7059c5e342ac51a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c64656c657465636865636b36","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000028504686173680200000000086d657461646174610c00000004046e616d65020000000c64656c657465636865636b36096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2d6176c98f425b90933198f0fa9be85d2971846a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STPP2XP9HX15Q44K66CF1YMVX1EJJWC4DBEN6R45","success":true},"operations":[],"transaction_identifier":{"hash":"0x1fd8c0165a2d294bacd79c3e4a30f78fc07152902723504fcd91bde7d449e808"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x39393e4c31762b58506ae4af74899590220a9ef9c5db6fbfdda31845faef8e4e","index":37301},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000033904687ea8fc9efe632b6cac791503532581d1f99082a86b22","index":2163571},"confirm_microblock_identifier":{"hash":"0x6ca4ff595f49a2c829bb2efff094068d9efe91647644c49c1fe6f0c75d632540","index":0},"pox_cycle_index":155,"pox_cycle_length":1050,"pox_cycle_position":820,"stacks_block_hash":"0x3a0f4059168156a5ae5305619809954762f328bab4bb5662c2afad22ef532249"},"parent_block_identifier":{"hash":"0x3fe98b97d78841043fd476eec9c6d8e3a9dc7289f7b2a2ad384cb5c88f3ff11b","index":37300},"timestamp":1645700038,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c616c7465737435)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":647210,"kind":{"data":{"args":["0x627463","0x62696c616c7465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040031ca990c19be7e69ad0ea4ec695f267adc528d580000000000000000000000000009e02a0000d1dcf3dda4b2e4be5ec3ef3bebb1bdef527617badad92148741293171c86590c340db48605668cfb54452f271464b61d3cee3640b033f738bf2ee0483d819da7030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a62696c616c7465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000028604686173680200000000086d657461646174610c00000004046e616d65020000000a62696c616c7465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a31ca990c19be7e69ad0ea4ec695f267adc528d58","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STRWN68C36Z7WTDD1TJERTAZ4SXDRMMDB29M4VNQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xe8f0645d0f44ecdb5ff89fdf05420e35872b98e075693c543434ff280c8fd452"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0cf921dc1611da47205bcdd39bae4ece21aa74abed66da29f9cc4ec29751f214","index":37308},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000002c6db7e6665c8a656e2a22bf6476681b802c57028fb671bd8d439daa","index":2163578},"confirm_microblock_identifier":{"hash":"0xe2a978935c69d330fb85bdfef51f6f1e90c155d1c65a3107ea8848d7683a3b94","index":1},"pox_cycle_index":155,"pox_cycle_length":1050,"pox_cycle_position":827,"stacks_block_hash":"0xe8b5924829401ac25fe018b89e46f332521fee8c615457eb99d3347f7c23e454"},"parent_block_identifier":{"hash":"0xc4b083e652a3be279372c3afafb3023a2ee6b1f33e1d240e211c5e4c265b3057","index":37307},"timestamp":1645703401,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c616c7465737437)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":258973,"kind":{"data":{"args":["0x627463","0x62696c616c7465737437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400796d0666b80b9ee13014d8105f218d536d6d86e80000000000000000000000000003f39d0000a6ba7047583a9309c2f54e7374ad36536439b38748723fbabb1428e225a1dc5b3fd3f56d72d8b4c0f2044cdd6054efea5a83d451cb303326218bf4d70cd205ad030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a62696c616c7465737437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000028a04686173680200000000086d657461646174610c00000004046e616d65020000000a62696c616c7465737437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a796d0666b80b9ee13014d8105f218d536d6d86e8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1WPT1K6Q05SXR9G2KC10QS1HN9PTVC6X0D4HMRM","success":true},"operations":[],"transaction_identifier":{"hash":"0x8f3aa612745142c0d533a1ae6575acbcfd41787f37036454d4851922e58de13a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xddbdd792ee79c04b3bcb3aa89188ae56aaf5aedbfb3bdd74bc3436e6a99c8d88","index":37796},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000004577d9bce43e9f735036d5c2a430d1dc5bf419a1b51443976115","index":2164122},"confirm_microblock_identifier":{"hash":"0xb1018bce5c4169395733171c010a3cf5fa0465e23d77b112dd7ad8afbb1dc7eb","index":2},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":321,"stacks_block_hash":"0x5516f85184d981167b84053498556ea672b1b9824f097809c26ed1f273eb5464"},"parent_block_identifier":{"hash":"0x42e9cb600030af1e7b0efda3a1c2ab9ccd22575eee955cb76419e9da54cc2d22","index":37795},"timestamp":1646031044,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374787472616e736665727465737431)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":2000000,"kind":{"data":{"args":["0x627463","0x7374787472616e736665727465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040099af17b22ae4df3046aee64e7155a0b122921341000000000000000100000000001e84800001be3e5d15f50bae33a11f92f55ace773a2445da3ed3198d8578efd90bec5af8ef54060778750a6bef99de969efa1e4d9f4f1116bde3ab795587515538f15af9cc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000107374787472616e736665727465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000029604686173680200000000086d657461646174610c00000004046e616d6502000000107374787472616e736665727465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a99af17b22ae4df3046aee64e7155a0b122921341","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2CTY5XJ5BJDYC26NVK4WWANM2RJ54GK8446NQ3Q","success":true},"operations":[],"transaction_identifier":{"hash":"0x9864b2faecd597f22f59c586a8ded4796ac16d10f3038469f6d92de27bf25acd"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xac1664bf59cbbe5131776da8867edf70c0ef0b8dcda01a7378bf84874161255a","index":37936},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000116972c082da7cedb2c0a3a4d434288c0f1aa4e144d3fe1064c","index":2164276},"confirm_microblock_identifier":{"hash":"0x30d64e6439507ce9b44fddecf35e81ec52d9907197633b7d66d700a0d5c04467","index":0},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":475,"stacks_block_hash":"0xdbf4f7797379222ca573fd4be2df3788fe8b18e8df77f9366a2e450c4bf9aafb"},"parent_block_identifier":{"hash":"0xdde4ff994bd6c8b3c2d2e800d6e8f1757cc1be874c773890e530c8b4b5ed73e7","index":37935},"timestamp":1646116205,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374726970657472616e736665727465737432)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":750000,"kind":{"data":{"args":["0x627463","0x7374726970657472616e736665727465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e515d5f26f0d9cc8aa2ad82c33edbf9aea482368000000000000000300000000000b71b00000ee01ac63c4a6cafaf90c80959a47833323b6a18ad56b6e9d61dc1d412a60848f376eba3bb6ea6f4dbdd6e312b398c69c67621e067546d2c6774fdb77b053deff030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000137374726970657472616e736665727465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000029d04686173680200000000086d657461646174610c00000004046e616d6502000000137374726970657472616e736665727465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae515d5f26f0d9cc8aa2ad82c33edbf9aea482368","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3JHBNFJDW6SSJ5A5BC2RCZDQYDEMJ13D2YAWCPW","success":true},"operations":[],"transaction_identifier":{"hash":"0x77928a23464d9664fcdfe6399809fb6ba9567b6b22e30aa7f320f0806dd1c1ce"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc969723e419b7daa1fb2ebc1271cf0eed1f51194b4ec82cf99f54aa92c0df19a","index":37955},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000011961cb6474e3cea3942bf20366cc83961f36172f575761f9b0","index":2164297},"confirm_microblock_identifier":{"hash":"0x3710525e29828eebc7be2a8f07080eb5b9889cf7ff74c5f83f5a8b532213ee49","index":1},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":496,"stacks_block_hash":"0x43e5b294c2dc5e5dcaa5eaa68825a5f1250d343dd58d51567798063be7d264d5"},"parent_block_identifier":{"hash":"0xd08dd8a8d4e5c67d32a5bb1473d56eaacb2c80ee4f1393c9846f423cc05eb4a6","index":37954},"timestamp":1646120327,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d696e6168696c)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":747526,"kind":{"data":{"args":["0x627463","0x6d696e6168696c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004005d39d62a20ebfa2473ae9426ad94a6dce633aaf4000000000000000200000000000b680600014b571da2dbb60f7cd6ae4e595729927636bbb506f2d950509ceea13b5847a7f34895a7d3f4579946f9c68a0c34c4b715fc44ed574bcab950736200472567c356030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076d696e6168696c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000029e04686173680200000000086d657461646174610c00000004046e616d6502000000076d696e6168696c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d39d62a20ebfa2473ae9426ad94a6dce633aaf4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKKNHA43NZM93KNTA2DBCMMVEECCXAYGSBT6V4","success":true},"operations":[],"transaction_identifier":{"hash":"0x55fa39332b08958a46cae402fd4c788f5b632367995a22dfe08eacf18d77fc15"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa315328351d31dfafbe3a90a9eb3512f24f0c3b68cbcc0bb78135bf9860dfcc9","index":37994},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000008960cb1d1395085e3e11dbce4e2d16040688e603b92d488696","index":2164341},"confirm_microblock_identifier":{"hash":"0x9571a5f59b64ca955ce251d7de9dd48c1d5fd516dcea574e68f6d29a4d5f598e","index":0},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":540,"stacks_block_hash":"0x02eb5a917d5be1d2d63cd832d72ee6a2c800d6a4a37a72e49a6bf464f26fd97b"},"parent_block_identifier":{"hash":"0x5ac42349b3b95c1f08210450751107f364fcfaf3a2752684e2f5936bd0d7fffd","index":37993},"timestamp":1646138342,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c7374787472616e736665727465737432)","execution_cost":{"read_count":16,"read_length":44043,"runtime":167659,"write_count":2,"write_length":172},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c7374787472616e736665727465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a1c83b45a8a03671012855eb0331b30054bed648000000000000000000000000001e84800001b2f45dc31b065678f1421da4f49ccf46b78d0e5e03843bb8f18c8f3595ce0c7639462c985b36ad5b03739dbe4cee4127b63b92271c17245ab8dddf78b70988a3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000156c6f63616c7374787472616e736665727465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002a604686173680200000000086d657461646174610c00000004046e616d6502000000156c6f63616c7374787472616e736665727465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa1c83b45a8a03671012855eb0331b30054bed648","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2GWGET5N2G3CW8151AYP0SHPC059FPP91EFX15G","success":true},"operations":[],"transaction_identifier":{"hash":"0x8f702f61576a38de612cd00cfccd3fc44384ae3ebbb3d89199c5b0825d5f3353"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd7c77e4d6b026c6a455780cf18dabdaa34f0fb8e76189e4e7c094a63a8a21488","index":37997},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000002a949f2ff534e85bf2a9b1e3c2c9d0742cd349063cf3c2cecf2","index":2164344},"confirm_microblock_identifier":{"hash":"0x0606c525ec73801686d16f8b075b7062bcb6adc56f66adc6a7bc36d6c54a661d","index":0},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":543,"stacks_block_hash":"0x3667a944dac2e7081dfd6fba9df8be248cc4847d183e8aaf741eceafd88efb8d"},"parent_block_identifier":{"hash":"0x6a7cc63a138db3e2ca5954d1adebe4dcdee736a1ccd226c95cdbe9e33d1407a0","index":37996},"timestamp":1646140393,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737431)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":1953091,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e16c694deb07a00c878f6026a2d43da11787e45f000000000000000200000000001dcd4300016773f9b84261ff067c32b9540b663521f843e3bd19440a78c96a0d4535eed75e780c4fce7a93290d12486f0df2ca4df513ad7275ca98f9dc2916462f848e0663030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002a804686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae16c694deb07a00c878f6026a2d43da11787e45f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GPRTADXC3T0347HXG2D8PM7PGHF1Z4BWN02F0F","success":true},"operations":[],"transaction_identifier":{"hash":"0xd9bfe8cc04552f69eed9a6eee03a68cf06a44da8a3cc0999ca4b53be558b9557"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc31801f5b3279cdacbea88986f813b773d3b3a91447791abf658bc084da33578","index":38003},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000002ebcc3b6c40e4787332f5e9c444fd2990f0ff8b1df07121a179","index":2164350},"confirm_microblock_identifier":{"hash":"0xd80ec96750ba7c7ae7ab8d29b2369a3604eb7dbedae904c3055abd09a73f0789","index":2},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":549,"stacks_block_hash":"0xf1038bb5d6c36aa2b04684db1346b60e509fc7ff27cccd52f8733b12d8e48a62"},"parent_block_identifier":{"hash":"0x6aaf0551cfd9b0209d204c915e8c3db6a5846c957d2522a3a0503e25a242e2bd","index":38002},"timestamp":1646142831,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737432)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b5936ca475358fa4fc493085f5b0a718d3ceff02000000000000000200000000001e84800000c2391475075268f7b7ec594393f1d121b4a56698bc8d46d8d539a9d54df7b9fc59ee8e597711e20838803ae6a8a6b41e1082f23efd8d4e2d21c4022ebf06c2bd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002ab04686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab5936ca475358fa4fc493085f5b0a718d3ceff02","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2TS6V54EMTRZ97W94R8BXDGMWCD7KQZ09GAQ5DQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x28be82b59c7bf9806a936c68d212633d942f802e5081fbbd6cf520deb80e44bc"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6d0a3b6fd94b4af4fa3eda026991e6fb105411510ba211dd30586209a0a457f6","index":38140},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000353326ba2aae2ed38bf339514fdff7207f9fe74280c520407a41","index":2164494},"confirm_microblock_identifier":{"hash":"0xb6ab2970ba22b2675cc41a641f814f7c5ee8c9def9adf9026504a6fb8305bd3c","index":4},"pox_cycle_index":156,"pox_cycle_length":1050,"pox_cycle_position":693,"stacks_block_hash":"0x37f42797f0d7fe692dee63f63f03b54b083088827d5d63ceeeac54f786dbe295"},"parent_block_identifier":{"hash":"0x365c9d421c25b16e7082f94b6a731d5b689f05743fa27a2b34374e81cba4493f","index":38139},"timestamp":1646232785,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374726970657472616e736665727465737433)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":367700,"kind":{"data":{"args":["0x627463","0x7374726970657472616e736665727465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040073c2f85ada2f042df9bfe09d5198cbac07a6df5000000000000000000000000000059c540001938e9f21a6215215b744812519ecccdfbd03eb38c85b61a5b9c62a7edc1deb235e1a1f97e8e5ce1c491c5b2a175a8d06c5ec7e6b890b7ee1ea803f369b26c03d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000137374726970657472616e736665727465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002b304686173680200000000086d657461646174610c00000004046e616d6502000000137374726970657472616e736665727465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a73c2f85ada2f042df9bfe09d5198cbac07a6df50","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1SW5Y2TV8QG8BFSQZG9TMCRSEP0F9PZA3D23JVN","success":true},"operations":[],"transaction_identifier":{"hash":"0x45c59e3faa4ee03a24507237250816c4b42418594ed3e2b39896ec1f23f63bad"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf8b0313bf671fdac4fa04a8f9633af8d111c77a91f2aa60544d304158b0a0c77","index":40256},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000008ee2d745ecf627ae38ffcd4da1525e94bdbd60f19e6cd8182496","index":2189759},"confirm_microblock_identifier":{"hash":"0xd703fdb45e838f1208d7c3b8044173c1815070437e77256a8813297901767d79","index":4},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":758,"stacks_block_hash":"0xc2b2eec18aca5adc3462a8aa79ffef8fd6370c26d89b800cb371726016176b9d"},"parent_block_identifier":{"hash":"0x9c40b4d08af235be97b843dee067182c286da6e9219865857b5ee1a462d825c5","index":40255},"timestamp":1647254607,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747269706564656c6574657465737433)","execution_cost":{"read_count":16,"read_length":44046,"runtime":167698,"write_count":2,"write_length":173},"fee":1750734,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747269706564656c6574657465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e6a0ee61f880917471f2586e7c4a7167e74c4b89000000000000000100000000001ab6ce0001371d656c118dde30ad3fb3f97ea6c1947b84f683126449029611f0f9f94dc7fc0019b510af002c7db5244c49d90738a216aba4e9d874751cc19dca9e09730614030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000166c6f63616c73747269706564656c6574657465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002bf04686173680200000000086d657461646174610c00000004046e616d6502000000166c6f63616c73747269706564656c6574657465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae6a0ee61f880917471f2586e7c4a7167e74c4b89","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KA1VK1Z2092X3HY9C6WZ2AE5KYEK2BH6GKW9AH","success":true},"operations":[],"transaction_identifier":{"hash":"0x7e086afb58b448ceaf40fa9f0b2fa8cc19ebc18f72a24adc2d889c273aca6ed1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x968689aae3da66b4e4900dea74aa3f8ec72c42392a0cd6d1671f6a856fde66de","index":40268},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000664d26798781e7ae9242092177179ca8f9597e7fcdc3e4f2359751e1","index":2189775},"confirm_microblock_identifier":{"hash":"0x34934fa98346f313d9a542e5e6d6b4a904e2b8d8b1ef5ab6065d80a975cceed9","index":4},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":774,"stacks_block_hash":"0xc8445beb575b76a76f1e5aeee59147e2cf0756f05754bc1e0759a0578a619eea"},"parent_block_identifier":{"hash":"0xd5e7076503fc2db58c51df4fd00ca4531a54d8a89cea190d54733a708399e19b","index":40267},"timestamp":1647265494,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c7374726970657472616e736665727465737439)","execution_cost":{"read_count":16,"read_length":44052,"runtime":167776,"write_count":2,"write_length":175},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c7374726970657472616e736665727465737439"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400ca06401043d2acd250e09e761c1a78b7641fc3b5000000000000000000000000001e848000004e96e54055d3e4ed23c0213c49009b5965dae641cfc90e59801707130d0cbb8a28e5fddb2e16adcbe4beaa61fdac1da874076b72f303ca37b63e47254087263b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000186c6f63616c7374726970657472616e736665727465737439","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002c104686173680200000000086d657461646174610c00000004046e616d6502000000186c6f63616c7374726970657472616e736665727465737439096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aca06401043d2acd250e09e761c1a78b7641fc3b5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST350CG0G8F9ASMJGW2F7C70TF2VP87Y3PP07KYX3","success":true},"operations":[],"transaction_identifier":{"hash":"0x65476d165339ba1f6d5ab40eb4ef52bc82927a3c23688c6451c7297366435c21"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c7374726970657472616e736665727465737439)","execution_cost":{"read_count":12,"read_length":44023,"runtime":132276,"write_count":0,"write_length":0},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c7374726970657472616e736665727465737439"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ca06401043d2acd250e09e761c1a78b7641fc3b5000000000000000100000000001e8480000050210493cb8040b3bb9a2685b7a477c496240c6d4318ebb5207e016d029aab5577d6db78d6b1565558bdf259dcd13f1ee586e696f5688cb53a85c51ed85d5d6a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000186c6f63616c7374726970657472616e736665727465737439","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST350CG0G8F9ASMJGW2F7C70TF2VP87Y3PP07KYX3","success":false},"operations":[],"transaction_identifier":{"hash":"0xbb0ab06bc4a635ba9c46f038f87480546f20b22f4c9f3153dd7b0b064babcf2c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c7374726970657472616e736665727465737439)","execution_cost":{"read_count":12,"read_length":44023,"runtime":132276,"write_count":0,"write_length":0},"fee":750000,"kind":{"data":{"args":["0x627463","0x6c6f63616c7374726970657472616e736665727465737439"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400ca06401043d2acd250e09e761c1a78b7641fc3b5000000000000000200000000000b71b00001b24549ebeca0de1f2169dd7c5bb3a150a814a0770cc33e7af4f947bd51713bb91a99c3a99faa6d063ec1f9a2a4319af134f3f82d499c24a0850208acee31e9e4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000186c6f63616c7374726970657472616e736665727465737439","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST350CG0G8F9ASMJGW2F7C70TF2VP87Y3PP07KYX3","success":false},"operations":[],"transaction_identifier":{"hash":"0x431ffe01eb1f763a579b06ce008ca390b2e75938006c5f0b956f39d39f101ab5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe73aa5efa051a05310c9a253fec59a423664be35fbed27cc34da2127eb7de2ac","index":40269},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000002beace52c412dbcb53d05915c0ff361ddefa576b024d7ad6eb1168","index":2189776},"confirm_microblock_identifier":{"hash":"0xee0c01e94025def1aee806e1703e032458f3a39df96598a310cfd3537550c15e","index":0},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":775,"stacks_block_hash":"0x7c625dfa21d31016f934911ee7bf3bca1df0b05cad7dc1a39e3cf362fd11760c"},"parent_block_identifier":{"hash":"0x968689aae3da66b4e4900dea74aa3f8ec72c42392a0cd6d1671f6a856fde66de","index":40268},"timestamp":1647266713,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737433)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":750000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e6a0ee61f880917471f2586e7c4a7167e74c4b89000000000000000400000000000b71b00001bc1e5b6b9cf74e8394c1ee9deb4dfedcbe0e8cf8cc0f18001ef32e03aec477257d01d7787e51fd7de6b02db66835f0b02323e9932ea9aa0b7ba5fdb77a10cdac030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002c204686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae6a0ee61f880917471f2586e7c4a7167e74c4b89","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KA1VK1Z2092X3HY9C6WZ2AE5KYEK2BH6GKW9AH","success":true},"operations":[],"transaction_identifier":{"hash":"0x350c8c4defd7d8a9aced3251b78a30c7e0ce63a2c61b88095f50ed63401ad427"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xaf77348be9b7faeea1237f4493dbcb8566874db1da77fc6634f5b896949c24ab","index":40352},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000009f5a0b363a527ff1beef7782cfe97537b53afbc5327d7a315","index":2189868},"confirm_microblock_identifier":{"hash":"0xb91d07506332df50d8416b30f6c2b5cfad1eb891da9e66660c13d23720091f90","index":4},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":867,"stacks_block_hash":"0xcbea11871712b0fb2a70849daf4f708c149ecdeecda126ce803a7a1449c32e9e"},"parent_block_identifier":{"hash":"0x64a89c88ede391678084135ee4caa72d9a1e6b43b9cbc222f91424c44d5250a5","index":40351},"timestamp":1647326106,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737434)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":1780661,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e6a0ee61f880917471f2586e7c4a7167e74c4b89000000000000000700000000001b2bb500015ccdc851eb34a25f7abc1c72b12bfda0116785c73eabd68770703298306ee9c60cedd9c245ee035b7c664f02c8240e3fd90a72a4a24dd0abcced9c2448a9b6b2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002c404686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae6a0ee61f880917471f2586e7c4a7167e74c4b89","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KA1VK1Z2092X3HY9C6WZ2AE5KYEK2BH6GKW9AH","success":true},"operations":[],"transaction_identifier":{"hash":"0x4fe4808b32d8219ebc7505428496250795932e4c34e16765ec83435995bae7a4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x93739e672ffeed02c8c4d7b6aaf1b1096a4d58dcc812ba78efa7e2340ae9833f","index":40355},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000cf3bf62859e645dab36d18f0551b3ca785ba13f9c7b002a655","index":2189871},"confirm_microblock_identifier":{"hash":"0xdbe80dd4767e7161c303e6dde1151c1bd36d19234bbb5748d174a5db0141ac0a","index":1},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":870,"stacks_block_hash":"0x0b0126c07875869934b9d912b085367b6e418523382bf0241248ac08b1d84291"},"parent_block_identifier":{"hash":"0x5fbf40e4146b41baf9a4f538924512b36b94185c6a40cc2eedb004b9587418ab","index":40354},"timestamp":1647327683,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737435)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c24000000000000000200000000001e84800001a25487d21f0f980ceacf786265639140b375ea59ccf65301861822bab125f82523f9a4e88a7a536336bbd98cb7959c8f5630dd7a89c648be571aa09bb893e922030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002c604686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0xafce58dee5732f27d0e02090860b5cc2aa0684ce1513df78a15f88627beb0159"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1010c35f960a2b6c5bdf326b452a7ffaad422934b6f540cdae811a75d5ca9730","index":40358},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000d57ba7d86fe528873536784db7e0f8da9c884e9492da2feecc","index":2189874},"confirm_microblock_identifier":{"hash":"0x8d44a2bd57ca109c5df0518c0fc2950fb7955879b3c5a8b164910e6d570ceab2","index":3},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":873,"stacks_block_hash":"0x445731db127d953973e562d3800c16df505b121dbd8af689cd0faaefc60de7b6"},"parent_block_identifier":{"hash":"0x3d23e3cca7242014ad4412101d18e2632d70975d82ab3e1968572049b462ca94","index":40357},"timestamp":1647328574,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737436)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c24000000000000000500000000001e84800001332d39b932d24580e9694fca88401fb819ca9ca57568ff265761d62f3e4cf86515c38865fd0d3216909caaff6461b844295786afa07a8161a45d9df67e7de2dd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737436","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002c804686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737436096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0xf8a8ec5f1c505608d4f50772db4dc11b83e4b6a97c4ef231aec0a814d6d8cf41"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x74817068f94d62402a4514e0257bb59817ab073a16df4f7c09b35d84479d072b","index":40363},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000048a635cf4722a85e76b8c0287123400c8ea1f1465128b045a8","index":2189880},"confirm_microblock_identifier":{"hash":"0x77e18eb64bba9b1bd117fe191a0fb94f1732692178c07b4428e42455ecdeabb3","index":1},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":879,"stacks_block_hash":"0x0d85ce7fd3e846d25a25589cf433eb7b0d344fae415d1d0fbe0deda9761a5135"},"parent_block_identifier":{"hash":"0xc6877789f8a641f0c5a9c498bcd0cfe0f4d8585ffb1e05b1d433ecff5b5d3da8","index":40362},"timestamp":1647332162,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737437)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":1742238,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c24000000000000000800000000001a959e0001e1d9407474ba263d7adbdd39aa30539219f4f35aa059b7e9c1ad330e7e48ccb4182eea46e31797d4885d427b8ae06f4835e8f56a0df52376c0ee348af010eb8b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002ca04686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0x3114b53fbe12ecc47e391a3b6b4b23d67c939e5c86ff1ad1870c2e398b56c02d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa70fd979df52d0f1b6e0ee794833161b92c4f511872435dda58a9da34d2565fb","index":40367},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000337707ae8e8c26b1a6c54dc4432d6c7dd2d1f70c6cb0b2754f","index":2189886},"confirm_microblock_identifier":null,"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":885,"stacks_block_hash":"0xea8607c1facd5bc68e2d8db883a7f69010548f74992da0820902cdd74a62fab3"},"parent_block_identifier":{"hash":"0x20a1aceaf6087bb1e19245da52864b722ce235019f29169fc81d6e7c3e533412","index":40366},"timestamp":1647334206,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737438)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737438"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c24000000000000000b00000000001e84800000d9b0f8e0ed7d8304e7a430e3ba0b0d0c92d9da2746f548fe3d3d3f2f72eb6e3c0f38e58ace2fbfee03244761c122beb79b2b54efd934e58e4aefd3d7fe026cf5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737438","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002cc04686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737438096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0x68079b809fd384435f9180406441d2276ca9cc4395e4f0955082dcae4878485c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6c0cfe85bc95d97bdcf1f228aa7c88a95dd312d2854db3a2bfa073684022893b","index":40383},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000a4ae1f1fe3301244e01bd5ae1dd82b065ae9fb826c11e5cb7398","index":2189904},"confirm_microblock_identifier":{"hash":"0xb9bd4a3835879cba51ac067fbeb8326a09af86938ebfd85c876f5ebaff8fac28","index":3},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":903,"stacks_block_hash":"0xe159282762a63a1cc3b46518377aab5a42637a93a12655f2fb397054c4c318e2"},"parent_block_identifier":{"hash":"0x45a975de6757ada62af3fa8161c08aff8e66fe006a6236fd9f81c3cd62f2061e","index":40382},"timestamp":1647346317,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c6574657465737439)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":2000000,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c6574657465737439"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c24000000000000000e00000000001e84800001533f73484cba2efeb45a14df8642847d0a4c339f1385fa9bc90d21765115dcc158dffda5c1f3498786c6aaba45801799a634c04a5ee54e361891156fbc4f89c6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136c6f63616c73747864656c6574657465737439","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002ce04686173680200000000086d657461646174610c00000004046e616d6502000000136c6f63616c73747864656c6574657465737439096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0x5c2c6607393881797c0d217dcb60e20967442f6c6ed098cfdc68fdf42104edd7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x71cb2e89e6f5e22d0c95df016dd4c8c1bbc12e7f9947d74c0abc119a8a6898c9","index":40387},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000089bfc843cb404ca005a02409211ac2781cde4c398b268a2e03","index":2189908},"confirm_microblock_identifier":{"hash":"0x0a5890fd184a0bdcb76733a28429199a2c0f1ff0251ad24dee9979bdf74b33e7","index":0},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":907,"stacks_block_hash":"0x18f311ae02f2b58b38788f1f5358adfd89198b7d4986322123c1966454f06d1e"},"parent_block_identifier":{"hash":"0x625968223859355eac4a459bf4a8bed697a2f1bf0e27b553e2b875084d2d2243","index":40386},"timestamp":1647349591,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c657465746573743130)","execution_cost":{"read_count":16,"read_length":44040,"runtime":167620,"write_count":2,"write_length":171},"fee":1159036,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c657465746573743130"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c240000000000000011000000000011af7c000021343a40f39f7eeaff6ea8d0f635b8ac7df2213d8480f68b2d3e55de5c7a9bc66be7e32314e524e7f98eef4c4c33523562895b8ba879d7f998e560fde783edbf030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000146c6f63616c73747864656c657465746573743130","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002d004686173680200000000086d657461646174610c00000004046e616d6502000000146c6f63616c73747864656c657465746573743130096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0xd70ae171b7d7d2876298d497a823152dc94a08a46c8e759e2ce20533625c9af6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5673874538202524b6ca7e1f7341c4d95ca229f3ade378609e7ae7d73222be0c","index":40390},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000bdd209b7b4d010dd0f06e7beb2769e50ff7e1f655fb558f317","index":2189912},"confirm_microblock_identifier":{"hash":"0x7e1b944ded47c65f81f9858f4f9fa82390d4aa75990d8d562bd5d008b1fca7f7","index":1},"pox_cycle_index":180,"pox_cycle_length":1050,"pox_cycle_position":911,"stacks_block_hash":"0x33d802401c2174f38e0f01ac61feb6cc99b91f5a3f4aa3720720b3a3c86c9b9f"},"parent_block_identifier":{"hash":"0x57fc7e8a14acda4c8395487cb9ab98f9f050dad75ff32d932f2041c801d349eb","index":40389},"timestamp":1647351632,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c657465746573743131)","execution_cost":{"read_count":16,"read_length":44040,"runtime":167620,"write_count":2,"write_length":171},"fee":581137,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c657465746573743131"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c240000000000000014000000000008de1100006107c1d1297045991238d3efe4916b60a9188ff7dd1193549fb41d35daf2034d7ed06ab1e93ffea8db01c8c9d277ad5bc48707455bb10c261824f16c892d8e36030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000146c6f63616c73747864656c657465746573743131","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002d204686173680200000000086d657461646174610c00000004046e616d6502000000146c6f63616c73747864656c657465746573743131096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0xa196117d8c9858b513c5e118016ead8a0fb5976ba75a10cc84ccaf72c7407131"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xee302bccc2d524f3d3b6c24a32d44fe913acd2fd9f1cbae5729521d68db23901","index":40524},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000cfa1643ad734e2de426884a9ed139c37e5f2d92d52b28c1e6f","index":2190071},"confirm_microblock_identifier":{"hash":"0xdde93c7e4bf811789bedfd5d67d72b9795f357125a7e199675362b13ff9a07b8","index":4},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":20,"stacks_block_hash":"0xd7f558e008421f6b723e5feae9892578c19b3e2d65ccf775303bef59729435a6"},"parent_block_identifier":{"hash":"0x7543902c09e1ed3b26849b770f3b0e8935d60097845053d075236673b126d635","index":40523},"timestamp":1647448379,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6f63616c73747864656c657465746573743132)","execution_cost":{"read_count":16,"read_length":44040,"runtime":167620,"write_count":2,"write_length":171},"fee":2761,"kind":{"data":{"args":["0x627463","0x6c6f63616c73747864656c657465746573743132"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400228e003a74845014e9f63f11741609a862a98c2400000000000000170000000000000ac9000026679dde2286c3921a9287cefbccbedf19b5facc53f280e6a4aa2989214122fb29bb151b14cd9ba0225236bdc88af93b424a24c121c07b4d4e11b70c0a17305e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000146c6f63616c73747864656c657465746573743132","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002d404686173680200000000086d657461646174610c00000004046e616d6502000000146c6f63616c73747864656c657465746573743132096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a228e003a74845014e9f63f11741609a862a98c24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH8W01TEJ250579YRZH2X0P16M65ACC4KVH6DG5","success":true},"operations":[],"transaction_identifier":{"hash":"0x0643b5c32f574bb75a54c980dd9ea6c30e65de602f528b1e29775bb7d5f8b31d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x885071268aac4c98af90b9439914c6abc65636ebd5e0b24275865ece0b8ba5da","index":40643},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000046a9305060c39e6333790927dd3e4331398b0a42e428855cd3","index":2190207},"confirm_microblock_identifier":{"hash":"0x147a13cbde98176ad1a7f9f62075263b8c08debce9bbf5485c9ec3c447db8b3f","index":4},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":156,"stacks_block_hash":"0x849eae9edf10f7593ac492706d2b6d1b7459d21471177325e5d651d968b216d7"},"parent_block_identifier":{"hash":"0x03d7413d5834a550c3037006c5e692800fc505324fe1bc727d4cffc1429475fa","index":40642},"timestamp":1647527579,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737472697065636173653374657374)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167425,"write_count":2,"write_length":166},"fee":2897,"kind":{"data":{"args":["0x627463","0x737472697065636173653374657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400af29d35bb578e683b6f73c4a2d906a7c4cca042100000000000000000000000000000b510000d94ddff4b142ddfc6ffcb9d14a1f52c736f49daccbe5cc8055ba22161f6c580777cbc14faf5d47cc8e4081cfcab40ad39e063530a87a237d806255931fd7c177030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f737472697065636173653374657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002e404686173680200000000086d657461646174610c00000004046e616d65020000000f737472697065636173653374657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaf29d35bb578e683b6f73c4a2d906a7c4cca0421","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QJKMTVPNWED0XPYWY4MBCGD9Y4SJG444K4M0G9","success":true},"operations":[],"transaction_identifier":{"hash":"0xf61fbe0e39f14665573a0699d20028c812fd7071fa653926f16858c4a4cb58dc"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc3c472701ca97c7cfbc19b1306022ea08cf419936eb574569581f93a9ef7cb9b","index":40645},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000a4d9295b3964a9383797fe365baf48d8c8cad6f67dae6dadb1e65830","index":2190209},"confirm_microblock_identifier":{"hash":"0x95ca348867f4fe6b286639020aff272f1ce25679f5118144e77aaf89ffa3e43a","index":3},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":158,"stacks_block_hash":"0x5930ea6ceb19863c431a84e6a6b77bf0e5b132c848370fdf88a2a017f63fced9"},"parent_block_identifier":{"hash":"0x173da37b7fa21b16a1ffcbb29c109b5feee9f272a24816f1cf8be9b20e914325","index":40644},"timestamp":1647529681,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737472697065636173653474657374)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167425,"write_count":2,"write_length":166},"fee":2773,"kind":{"data":{"args":["0x627463","0x737472697065636173653474657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400386135d2d957a2b8cc1098ac8913c1f69cf82e6000000000000000000000000000000ad5000090a3e6c02812bcaab818da0d0b983eb927eade895a4979f8060384f38baee0d537c2f9caaf810d08f09d6cc328fc0469d9a10353e57b47d46ab5c6e4fef00b0e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f737472697065636173653474657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002e604686173680200000000086d657461646174610c00000004046e616d65020000000f737472697065636173653474657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a386135d2d957a2b8cc1098ac8913c1f69cf82e60","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STW62DEJV5BT5E6C22CAS28KR7V9SY1EC3EM31F3","success":true},"operations":[],"transaction_identifier":{"hash":"0xc57ffa3d73d6dc0479168773e1869fe2ab82b31f9e5cf2c10ff96719b512c774"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x60aa441ee0dfbaffd710c86b902730aa03710ccb29a892074f560120340c6467","index":40647},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001ebb0129ed48f4303ecdee95c02d858503329b22fcf32e70d7","index":2190211},"confirm_microblock_identifier":{"hash":"0x0cdbd27b2602db5f25090ac996c69c6e46d0115de2c398522ee620ff20f1a903","index":4},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":160,"stacks_block_hash":"0xe20634edaea39631745dd75c5f62ca246e6857cbeab99455e580f35cdcb6aed4"},"parent_block_identifier":{"hash":"0x93ffe4526dac0f22d4f5fe6c27a35e07599a793f7b251547743e3bdb2d510e93","index":40646},"timestamp":1647531537,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737432)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":2367,"kind":{"data":{"args":["0x627463","0x7465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004005c30844e4f5a432c403fe965eeae50d1d212736b0000000000000003000000000000093f0000ff03882249089e2ee0004dcd6259576174421a8b7d3ef74196f5e9161ba763c50cc4e7b04c7c7689d5352e30acbc6d1d72d3507031729ec0d72fad6a9d4958ac030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002e904686173680200000000086d657461646174610c00000004046e616d6502000000057465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5c30844e4f5a432c403fe965eeae50d1d212736b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1E3112E9XD46B207ZMPBVNEA38X44KKDD2NVZJ2","success":true},"operations":[],"transaction_identifier":{"hash":"0xc0552ed3f2b6922509a60e1cd5353eaee9389b2d84b43dbdeb183cc67fc0ace7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9ca0a6594c1e18f4805804daefba075bed4091138c55b78292f79f104f727aaa","index":40656},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000340363c85158f11991806114c6e9e9f5eb953a2f4b55726602","index":2190220},"confirm_microblock_identifier":{"hash":"0x5f08e9dec736471348840ad0482becfc26501d3dd0f4e0ff7182b83a11dc4948","index":0},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":169,"stacks_block_hash":"0x0b0a63079e9cb423604048fd593e9de47a228e074b6f8f758fadce739667c755"},"parent_block_identifier":{"hash":"0x212cb356b832fcea23d1cd862d58a2165d16efbe7dd634470ed14d09bdac71d4","index":40655},"timestamp":1647535851,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737472697065636173653174657374)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167425,"write_count":2,"write_length":166},"fee":519,"kind":{"data":{"args":["0x627463","0x737472697065636173653174657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400694d0ef8bec6d2717ecabc7536422fc9ca52c0f500000000000000010000000000000207000111570e0dd682492ccabcc211c0b417e5fd2dcc17d5091c6cdfa21e36d1ccc5166eb11150f077d9b3d95fc7134f9fe08e94c739cad03721b8176069fd34472224030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f737472697065636173653174657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002ee04686173680200000000086d657461646174610c00000004046e616d65020000000f737472697065636173653174657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a694d0ef8bec6d2717ecabc7536422fc9ca52c0f5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1MMT3QRQV3D4WBYSAY7ADJ25Z4WMMP0YMNDNJMR","success":true},"operations":[],"transaction_identifier":{"hash":"0x989d0d3468cb2987f8868f8f69e8a87b51a45a401a3d95a868be30e7661c64ed"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc4fac0b72f11af62fe1339111893ea18b40e558847c830b05532f6e16969bfcb","index":40741},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000008d1c33226f60830da272709a59d48b9764cc2021ad5fabd2dadc9","index":2190309},"confirm_microblock_identifier":{"hash":"0x5b61cb5fcba9c80dd1055745ec1a5c8ebd587412888ed675c693f16e7fa55234","index":4},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":258,"stacks_block_hash":"0x0920516c7a3fe24b8465ea658918943a4b111908dc7b5217aae8da03d5e92074"},"parent_block_identifier":{"hash":"0x55f0bcb68375b0931f3d671d89002d3dfae8b6bbfe4c0129adc97eed69fa5120","index":40740},"timestamp":1647598807,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f6d62696e6564636173657465737431)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167503,"write_count":2,"write_length":168},"fee":562,"kind":{"data":{"args":["0x627463","0x636f6d62696e6564636173657465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040002bd1e3094e4d11965385dd586af20a9cc8c1ec200000000000000020000000000000232000073d0b85691420e08f92bb3645c11562ae8e3f1b51edebbf03f26c7fcb6059f2e5af6f934991961a34ddfb6453afe6de6c7d249c4eec676048801109f03df09e2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000011636f6d62696e6564636173657465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000002f204686173680200000000086d657461646174610c00000004046e616d650200000011636f6d62696e6564636173657465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a02bd1e3094e4d11965385dd586af20a9cc8c1ec2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1BT7HGJKJD26B571EXB1NF42MWS30YRAVFS2F3","success":true},"operations":[],"transaction_identifier":{"hash":"0xb9e54872f97191fecd1ddbf77930cc57f3d7cd214cded4a298ffa30de2f25f29"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x58659300ee7f83fb5dda7e785ee30579aa17ac988a0c156994be514a552ccfa4","index":41293},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000080397ca3b28c296fa9f5dda239fea9a87ac4d0d80a8a65d546","index":2190932},"confirm_microblock_identifier":{"hash":"0x314127f9d20bbd527e1859dcfe5d9742c18560fa20ef47ab53a2d115b81b2e78","index":3},"pox_cycle_index":181,"pox_cycle_length":1050,"pox_cycle_position":881,"stacks_block_hash":"0x9f51e91a3b6c774d9ca8c5f8ce3a10376a2133a0b07d1a6522f7010e4b27dba1"},"parent_block_identifier":{"hash":"0xf3f6636d9d828259ae97cb0595e7cd3f902d2eba8b15c084dbf467213207654c","index":41292},"timestamp":1647949013,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73746174757375706461746574657374)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":493,"kind":{"data":{"args":["0x627463","0x73746174757375706461746574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d3b204b57b64c93c5d8d1a1fe53787263346372b000000000000000000000000000001ed000175ee7833fed02a15c82c06cdc62e127dcc1093fd9d64602e15dbe8c066542500068504cf9c39569677b7155825af6ef7811cfdf81ac352f09ff7cf6537b01445030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001073746174757375706461746574657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000030704686173680200000000086d657461646174610c00000004046e616d65020000001073746174757375706461746574657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad3b204b57b64c93c5d8d1a1fe53787263346372b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST39V415NFDJCJF2XHMD1ZS9QGWK36HHQ5E56JTKZ","success":true},"operations":[],"transaction_identifier":{"hash":"0x13838c53d0ce557864c44af296895952ec49c2741b2567324c83ea14f053fc03"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73746174757375706461746574657374)","execution_cost":{"read_count":12,"read_length":43999,"runtime":132068,"write_count":0,"write_length":0},"fee":493,"kind":{"data":{"args":["0x627463","0x73746174757375706461746574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400d3b204b57b64c93c5d8d1a1fe53787263346372b000000000000000100000000000001ed0000727deeab11b06f2fd65a9cbd72170f71ad169592b461d886ec15c874e881dc5b2db747588269c4308a11f0cdb31c8496b316d8b27b107eae46aca889fac691f9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001073746174757375706461746574657374","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST39V415NFDJCJF2XHMD1ZS9QGWK36HHQ5E56JTKZ","success":false},"operations":[],"transaction_identifier":{"hash":"0xb66237b0d724d51721f1187744095643571f566ccc52c55a69ec69096df97065"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8db28c68feca45d532678278418f0eced4ad0b7eb1ab5cd42127ad7c0effcdd0","index":49377},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000518ca12855dadee850175f0b707c67d57c16eba08b63a581ee","index":2222516},"confirm_microblock_identifier":{"hash":"0x7ef66d4109abfcc08fc32ff18cadc437cd412b12f6dbeef8fd509a0abd572690","index":2},"pox_cycle_index":211,"pox_cycle_length":1050,"pox_cycle_position":965,"stacks_block_hash":"0xadedbe6db8dcbd81f94636de4b0c8ddab961b5e223728506abd71902ead10497"},"parent_block_identifier":{"hash":"0xaa95c4d85fadd92c7b0ba73905e0d78801ce6d9e24213d0b6054d3e67333b944","index":49376},"timestamp":1651771669,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x627463)","execution_cost":{"read_count":16,"read_length":43989,"runtime":166957,"write_count":2,"write_length":154},"fee":3000,"kind":{"data":{"args":["0x627463","0x627463"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b356d799f0621ef25fa7b00225898e86302ee9a900000000000000020000000000000bb80001d0d2d1cb0e38884bd36e160caeaf3abb93b4430751c1e8dc576a4a36d5a771f500845fa52ff1164f71e84c5e300c78684579ace3ffa432aa44146abcbaf14433030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000003627463","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000045204686173680200000000086d657461646174610c00000004046e616d650200000003627463096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab356d799f0621ef25fa7b00225898e86302ee9a9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2SNDNWSY1H1XWJZMYR049C9HT330BQ9N5A1XN2X","success":true},"operations":[],"transaction_identifier":{"hash":"0x7d2ee5c9ae6cf0ad9c3c3c386b018bff96d00dc4b88aca00c99d533ec9ccf120"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x874180e55fd0e4e713ba6d5dc6befecd3a2caeec893e6abf541838b4e9b2adad","index":55768},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000006d6225dc9235962026c01c0bfbc9b2d25e608d16d58975ac6e","index":2252745},"confirm_microblock_identifier":null,"pox_cycle_index":240,"pox_cycle_length":1050,"pox_cycle_position":744,"stacks_block_hash":"0x1004b88d3626090c549ec60857093e3d758b2c0860a5b7793ed8f0b7c52a05a8"},"parent_block_identifier":{"hash":"0xbf1f5b613038821fe62ea893d1e8d9dc900a4b87d3dfa603546d2a18bafdaadc","index":55767},"timestamp":1653978215,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a7573746174657374)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a7573746174657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004000a741da9894f9b88d2b651918faaf9034519b61600000000000000020000000000000bb80001f6779940b4f020cab10c7728f2b920eae3c55cf67ff2a3876ee4528b76477d7a2d75dce2f8cce12345e028fd085a7b76199968b291484b85a3c66e7b9c12ae6f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096a7573746174657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000049204686173680200000000086d657461646174610c00000004046e616d6502000000096a7573746174657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0a741da9894f9b88d2b651918faaf9034519b616","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST5787D9H57SQ26JPS8S33XAZ41MA6DP2VHXQ0W4","success":true},"operations":[],"transaction_identifier":{"hash":"0xa55b07629c73e41f7ee800e9d39fca3dc414655c2e99924fe2b50c84329f7eaa"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc474d53d4dff11bdef669704747bd4cb4da2161281d480bda43aea4462e1becb","index":55801},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000571cc9a5fd08ffb02861c503fe97b57ae303813ca2fae733ef","index":2252782},"confirm_microblock_identifier":{"hash":"0xc11808c57d28aebd96deae58d947144387219354653788c0708b65f0d94e9b99","index":3},"pox_cycle_index":240,"pox_cycle_length":1050,"pox_cycle_position":781,"stacks_block_hash":"0x9e81ccc3a4bc46522603d9ccd684714882721c9384559156c2e82ac74d79708c"},"parent_block_identifier":{"hash":"0x3292760d966e2022c2bce3f80831d201bb0d711c6b9946ddde1581e92f4c8f84","index":55800},"timestamp":1653989474,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7761716173746573743131)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x7761716173746573743131"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400dc228d23098159e62ef42d1261838ab1af15a6df00000000000000010000000000000dac00006024e9299ec6d468c134431f5f3069262011e8615ec69375669905ddc127aff00e42d4e0316afc0592af990445b4dcadd7219ddc855664d8b545fd2b6c0f1531030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7761716173746573743131","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000049a04686173680200000000086d657461646174610c00000004046e616d65020000000b7761716173746573743131096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adc228d23098159e62ef42d1261838ab1af15a6df","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3E25393160NKSHEYGPH4RC3HARTY5D6VWN1TS64","success":true},"operations":[],"transaction_identifier":{"hash":"0xc32ea0f7da6f80402a6d4860e84f30a7156dee52b0cf293505f151aac87524f6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0284c6b31693192948dec02bfddf7b1e37ff10a152fb36458195e54f63fa39e7","index":58659},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000002dbb019b9a7fed81da1208b01a78a82d0641f4c23893065680b","index":2278320},"confirm_microblock_identifier":{"hash":"0x90adc94b12ad2d37e5f8aec36f6f02c4c5d33ae0e83d96e9def8419165e2c398","index":0},"pox_cycle_index":265,"pox_cycle_length":1050,"pox_cycle_position":69,"stacks_block_hash":"0xcd841d52a0ef1852500c48cda581b281c43db139c3fc0ee511e1b8a438bcf4c8"},"parent_block_identifier":{"hash":"0x506580bceb08379cef3870e45b5588d3878dcbefd33c3ce6ccb236fc42ed29d7","index":58658},"timestamp":1655444858,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737467616961737461747573737478)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167503,"write_count":2,"write_length":168},"fee":3000,"kind":{"data":{"args":["0x627463","0x7465737467616961737461747573737478"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400960b755aae76a90d685747dbaea9803907c8ad1a00000000000000020000000000000bb80001d89ee941970cd02d0e735f101648cfd9f74a90e17f6955642bcb7968f1ea34bd5eaf5b80746b3452f17368af02255ef185b6270fde9c1c56e3956d4e963f674e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000117465737467616961737461747573737478","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004aa04686173680200000000086d657461646174610c00000004046e616d6502000000117465737467616961737461747573737478096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a960b755aae76a90d685747dbaea9803907c8ad1a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2B0PXATNSVAJ3B8AX3XQBN9G0WGFJ5D393KZNSD","success":true},"operations":[],"transaction_identifier":{"hash":"0x15a418cfcbb4bb685194b96681b7d4b280274c259f74667edafa1f0b62796585"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x18d2112f913962d462bd44b690afbe9bb6ac7d29ce312bd6502f114c2c0c0160","index":58677},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000558a96c9d51223fdb6297c0456dff58336b88e707f96f3b6a1","index":2278373},"confirm_microblock_identifier":null,"pox_cycle_index":265,"pox_cycle_length":1050,"pox_cycle_position":122,"stacks_block_hash":"0xbe9980a5790ebb3810fd5e6ab5b24079b08c394f1de6680b765192f063c53cc7"},"parent_block_identifier":{"hash":"0x68be1eecf0a401cef3a9e8186c2b8843425d0d727ef231494b346372add5d932","index":58676},"timestamp":1655447613,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737472697065746573746761696164656c65746564)","execution_cost":{"read_count":16,"read_length":44043,"runtime":167659,"write_count":2,"write_length":172},"fee":3000,"kind":{"data":{"args":["0x627463","0x737472697065746573746761696164656c65746564"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400997082d01dfe12d68677a3db9123f959301f7f8000000000000000010000000000000bb80000717cd70e6eda5a15516a1d187859b41b2d15b684bef2b18f7cccde14828b0b9a4bd3f5b89b6c1b8c7960bf41687bf8b857bb41af6115b8ebb68592f812a241e0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000015737472697065746573746761696164656c65746564","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004b004686173680200000000086d657461646174610c00000004046e616d650200000015737472697065746573746761696164656c65746564096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a997082d01dfe12d68677a3db9123f959301f7f80","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2CQ10PG3QZ15NM6EYHXQ493Z5CK07VZG3YGNF4T","success":true},"operations":[],"transaction_identifier":{"hash":"0x1bf18458ae6a765c49e1238730912b1fdea65d2710923d4048912dc86d74607e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x540aa14f5a416736d367cf2262dd9fa50a24f4a89bcc6e506826d8c14d627b1a","index":58720},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000237962c9d964dc1ab73b3d6b76a5882c4686c6904baa5545395","index":2278456},"confirm_microblock_identifier":{"hash":"0x9e216e1c24f13143d031fe040186dc455af48924d01341a24ff2c26baf580d82","index":0},"pox_cycle_index":265,"pox_cycle_length":1050,"pox_cycle_position":205,"stacks_block_hash":"0x313da8f4efb3fb059db76873cdd99c5365e7b8c826f97ca6ebdb84311c624c28"},"parent_block_identifier":{"hash":"0xda734fe4401d220bee4b09b8fecdcd0b7e32bfec6340f0717366b000fa9cb7f8","index":58719},"timestamp":1655453693,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7761726e696e677465737464656c657465)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167503,"write_count":2,"write_length":168},"fee":3000,"kind":{"data":{"args":["0x627463","0x7761726e696e677465737464656c657465"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c67ad9f5791119bc267412fc62bc630b6993009700000000000000070000000000000bb800000e94be1e8a9768e00eeda067cc8f5274baa9f8c399d971d6c4f93de1e178050c6dc512dee776f62fc95a145aeeffec0c283a9d968676685057c0331e9030e92d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000117761726e696e677465737464656c657465","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004b604686173680200000000086d657461646174610c00000004046e616d6502000000117761726e696e677465737464656c657465096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac67ad9f5791119bc267412fc62bc630b69930097","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST337NPFNF48HKF16EG9FRRNWCC5PK4R0JZ6PKJW0","success":true},"operations":[],"transaction_identifier":{"hash":"0x863c96ef9e639036526ce94cc53663db5df0f096d555eb0b7942b48e7faa2fdd"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4fb428e4bfc8ce7f7b88d5d5af7ae8fd26b85dfe79374d74f8be4cdbcfcbe1cf","index":58725},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000cb9e94e9fc6e9df39bb14bd512c272792adf782521055eb9a5","index":2278464},"confirm_microblock_identifier":null,"pox_cycle_index":265,"pox_cycle_length":1050,"pox_cycle_position":213,"stacks_block_hash":"0xfe775bd181993a8a9cd381cc01118eff1cbb77fe4c2ef5c150ee54b2eb0fbde1"},"parent_block_identifier":{"hash":"0x3075d20774141633763587d9a38fec969e637c91f201e01cfaeb78a682687b8d","index":58724},"timestamp":1655454270,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737464656c657465776172726e696e67)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167542,"write_count":2,"write_length":169},"fee":3000,"kind":{"data":{"args":["0x627463","0x7465737464656c657465776172726e696e67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c67ad9f5791119bc267412fc62bc630b69930097000000000000000a0000000000000bb800007bcce2e30c0ed8c6d866a9c6617e98765e6b21ecb0ab1404f0d85095584e364552d4e40c5a6003234c9e56a3d9697d09c268357bc7ad733f16aa5b758e60ff08030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000127465737464656c657465776172726e696e67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004b804686173680200000000086d657461646174610c00000004046e616d6502000000127465737464656c657465776172726e696e67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac67ad9f5791119bc267412fc62bc630b69930097","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST337NPFNF48HKF16EG9FRRNWCC5PK4R0JZ6PKJW0","success":true},"operations":[],"transaction_identifier":{"hash":"0x67d1ca6785b80958bf98d666fca86a1cbd78d8c6caab3197b25070e250710eb1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x06b1d42602d7c231ceff77e565ea8465127efe06ca814ba993ed5f671c9efdd8","index":58801},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000030a79dae1be97e0ac9099a301e45ab298624cc850dcde4c2402","index":2278686},"confirm_microblock_identifier":{"hash":"0x5eb8aba97ce00a0e1a2f4093f6601056b5fdecb4771f3cda352242852bb192e6","index":0},"pox_cycle_index":265,"pox_cycle_length":1050,"pox_cycle_position":435,"stacks_block_hash":"0x9e2bfa98d5ef8f1fed2fdad6cba26a92dd7c86955dd6ed11845e0e4e3188341d"},"parent_block_identifier":{"hash":"0x9d530d7c9e22a8e45b7173cf9b67b46d57bbd260397eb971d14d36ab522d485e","index":58800},"timestamp":1655466910,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737465707465737432)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x737465707465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400609e9cfd329ed7ee066d758b86829297b0108b7400000000000000020000000000000bb800014dd6387032f3b76c628a7b65b74b1d3cbdb5c8628d7ef4c5f320310af878ed9a3507ccf265d9dc95c233bb53256b39fc368944d1a201e900a1f3f50c8345148e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009737465707465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004bb04686173680200000000086d657461646174610c00000004046e616d650200000009737465707465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a609e9cfd329ed7ee066d758b86829297b0108b74","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1G9X77X6AFDFVG6DNTRQ1M2JABV044BEJ5ZKVBN","success":true},"operations":[],"transaction_identifier":{"hash":"0xb42948f9ff2e05c4584d2e83c24e91bc1fab351882f9f602a67b6077bac47d98"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x896f23e59add12c2cb5a44079dbfe3524ca6096f77101445d3b8dbcfec184839","index":59838},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000da4721ed9b47d740fce1fd0716cf2cb4107b42ef48aa6d1819","index":2280820},"confirm_microblock_identifier":null,"pox_cycle_index":267,"pox_cycle_length":1050,"pox_cycle_position":469,"stacks_block_hash":"0x29b1e88e261771f819a6999765a3b65c1c06ecb3e5b3c37a080dac15893d8a0c"},"parent_block_identifier":{"hash":"0xfc6f6146c5e5de58ef8fc384e8567e3d12bdf18d3ce21ece6373cd1ad4629a64","index":59837},"timestamp":1655709629,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7761716173746573743330)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":4200,"kind":{"data":{"args":["0x627463","0x7761716173746573743330"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e9ee5be86ec9e38e491aef3993dc1c248d2bf7ba000000000000000800000000000010680001a5e00056ca09bfb7380395916a4eedefc863e33969e10cfa779ee0e9013306262a214117f38516cfccf24c536d97ffb65646377fccf8009bf09a9ff79fe941fd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7761716173746573743330","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004bf04686173680200000000086d657461646174610c00000004046e616d65020000000b7761716173746573743330096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae9ee5be86ec9e38e491aef3993dc1c248d2bf7ba","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3MYWPZ8DV4Y73J93BQKK4YW3GJ8TAZQQAFSRYNS","success":true},"operations":[],"transaction_identifier":{"hash":"0x63e9314854b94f4bfb7981e0185a279413d60b2038672e3b15c0e5524152e4bf"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x18e5a2a5ab16accda13b07fac52770b6fc0280406187d662a9155053c23eaa5c","index":60102},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000006f397b19374a5354d52136fd0b4babf8d54fa865122f5eaee6","index":2281162},"confirm_microblock_identifier":{"hash":"0x9e1ce08d129785a79f25c7dd3d9bfa88f42297c55652740bfceacdcaf160a22a","index":0},"pox_cycle_index":267,"pox_cycle_length":1050,"pox_cycle_position":811,"stacks_block_hash":"0x604ac75c3c2ed74c4359152a1b2422ccd2cf5709a46f166ed6a1b10d99267034"},"parent_block_identifier":{"hash":"0xfbd9683268f8db6fce282f2dfe44f98c16a7cd3e7cd31023d1d735351bb54d5c","index":60101},"timestamp":1655794409,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77617161737373)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x77617161737373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005cd708cae3bfab26be5838dd1080b274f4d4105e00000000000000030000000000000dac0000a429e373de6e15bde197eecaa26ea1483e188c3d5c31d36be308fb438d966bbe0603d9c88f58e03d7388a2c11d7d3b6d2c60fdf986c5f30052f9f0258d742b55030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777617161737373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004c604686173680200000000086d657461646174610c00000004046e616d65020000000777617161737373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5cd708cae3bfab26be5838dd1080b274f4d4105e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EDE26AWEZTP9NYB0WDT440P9TF9N0GBSVH21VS","success":true},"operations":[],"transaction_identifier":{"hash":"0xb28fbe306fbd92514c5fe653963e9ed11cbfa58085f1a4433d9c8b139278e0ff"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x31c81caddaeabd315bfe42908a79000d878f8f8d09dd5bc2f6f3805f601e84e5","index":60166},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000010673c38c6899f41bb3643053a4ba6494637092be09d7179b8","index":2281233},"confirm_microblock_identifier":{"hash":"0xc3d309f418f7e0236c5fa0f585a9ce3162f30fc1c0be3da632cc0af1c201dd14","index":0},"pox_cycle_index":267,"pox_cycle_length":1050,"pox_cycle_position":882,"stacks_block_hash":"0x04544bdf7f3ce2943cdbc78257b910311aeba2cc9e8492731e8c79fbb05327c0"},"parent_block_identifier":{"hash":"0x6f151becfbe932c8f56f25b5b99b982433630bdb4df3f84335e3698ef606b3d1","index":60165},"timestamp":1655814463,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666b646a616e666a64616b6e66)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x666b646a616e666a64616b6e66"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400223fa3bf8ef52bf20aed9a3f55236dbc82b026fc00000000000000020000000000000bb800018644b14904a8af17b13a6629db45a290b5ee3da0db0d33de6680edeb70a8958d79ca62c68dcc5cae61ac868d4956f47cd45477ecfba406f8372c3ea544e5c7c5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d666b646a616e666a64616b6e66","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004ca04686173680200000000086d657461646174610c00000004046e616d65020000000d666b646a616e666a64616b6e66096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a223fa3bf8ef52bf20aed9a3f55236dbc82b026fc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH3Z8XZHVTJQWGAXPD3YN93DPY85C16ZGCCMXXW","success":true},"operations":[],"transaction_identifier":{"hash":"0x0e709c8e76eb6452ebcd0b16b2b0c4ddb0b89b36772ec05c2ea736738619491e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa2a97ab36cb8021bc9d28b16c8818324fbbe890db6470ec6d480087df3c1a234","index":60174},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000289de124d0a21bdc3608ad8be613c6e9e22805153e55eda898","index":2281243},"confirm_microblock_identifier":{"hash":"0xb6e98387df2287b05a1085ab23c42a1086c2887fe35c133c7e13924f1fb8d282","index":0},"pox_cycle_index":267,"pox_cycle_length":1050,"pox_cycle_position":892,"stacks_block_hash":"0x6553329cc0b67ad348f4b1e9688cb4059568f7fce26e2cab2c6bf86e01d3a63b"},"parent_block_identifier":{"hash":"0x751bfc00f5f68a594a1c1d8a40f8ac3a5c24ad0e9a412dcb75c0b3d504876db9","index":60173},"timestamp":1655817060,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6a696f66616a696e)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6a696f66616a696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400223fa3bf8ef52bf20aed9a3f55236dbc82b026fc00000000000000050000000000000bb80001f1e94f55428d3ca555a3e41d73907c5a6c40a3efa53ad0fc2133b46c64c296e36067f861eab081ac61966ad9533b1c55ac087c5743e817244af42c64ed801560030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096e6a696f66616a696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004cc04686173680200000000086d657461646174610c00000004046e616d6502000000096e6a696f66616a696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a223fa3bf8ef52bf20aed9a3f55236dbc82b026fc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH3Z8XZHVTJQWGAXPD3YN93DPY85C16ZGCCMXXW","success":true},"operations":[],"transaction_identifier":{"hash":"0x95b4255390c4032d702e086e198d195e093deee6d2c91484d7378462fdbc275d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1d255bf229fa6c32f0309122c36862a040c95ace637c9b106d4a99e3de961253","index":60958},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000001cc9c6c72ccd58c1fbd56e548ab251c388c6f8b695f12385762c7","index":2282233},"confirm_microblock_identifier":{"hash":"0x40d6e44885b930dc254e03cb222b7208b843167d18f8c192d819ebbd0c61a441","index":2},"pox_cycle_index":268,"pox_cycle_length":1050,"pox_cycle_position":832,"stacks_block_hash":"0x8e6811639f35177879238b81409bf68c86a2c5c12670e3a1e0b5a7aa3b3bc109"},"parent_block_identifier":{"hash":"0xd322edce41974fc78b929a1d20afeac844f51a0c4d9415b1774b84cb698e2bf0","index":60957},"timestamp":1656072111,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6166646a6b6e666a61646e66)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6166646a6b6e666a61646e66"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004001a60b0e4d6142ca5c5ea750103c713bfeaca4e8200000000000000030000000000000bb80000f52a59925e5b1d06efec6d5ed380b22c7315816869b9287d6779c93efa8cd23c5a1bd5df33089ffbf059663ee57dca0b97aba35f55ae0b47af3e278cb632ac12030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6166646a6b6e666a61646e66","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004d804686173680200000000086d657461646174610c00000004046e616d65020000000c6166646a6b6e666a61646e66096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1a60b0e4d6142ca5c5ea750103c713bfeaca4e82","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STD61C74TRA2S9E5X9TG20Y72EZYNJJEGAKXXQNR","success":true},"operations":[],"transaction_identifier":{"hash":"0x41c569626bfb942fd38c2ad0a462ea4d5e1bd13d97b3064c971ddaa63a35bfdf"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x97f3bbe02e63c8a427e5aea941f08986a346e76d263558e36d94e9a0d5c0e57e","index":61684},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000005a9a507d29449c50493eff394e95fcf552b50ad0deb712c8a0","index":2283044},"confirm_microblock_identifier":null,"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":593,"stacks_block_hash":"0xab086e172fe69a8e7dca4135cb715f918a616488550042e76e451dbc63bb39a1"},"parent_block_identifier":{"hash":"0xd44b80de4f1a58f4ef94c65e58bdcb331e3904e0d5034c35b25b8e665add94fa","index":61683},"timestamp":1656404084,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265706c6163657465737431)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265706c6163657465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040095f47112fee93c25463a377a4ed06d570091378800000000000000020000000000000bb800018454c6d66dd8d25e5164a1cf5d56f3d0e3988d95ea6c35951a0d6cdfe512dad8529298b2d82e98c17a790004772404f6b14143f769d0b2ebf6033873f29a6a05030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c7265706c6163657465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004db04686173680200000000086d657461646174610c00000004046e616d65020000000c7265706c6163657465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a95f47112fee93c25463a377a4ed06d5700913788","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AZ8W8JZVMKR9A678VQMKPGDNBG149QH03QBVN8","success":true},"operations":[],"transaction_identifier":{"hash":"0x6ad2c775a9aa542baa8e212b1971028732ad9ed3961eef1f184c41d99ac92120"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5758e4455f3898933fd348749ca80352ae8efa034344832677aa8e87ba4ef443","index":61721},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000016d5374904bb8ec79abe4147d094fcd44cb09dfebab4fbc499","index":2283083},"confirm_microblock_identifier":{"hash":"0xc254addb0c1a4c7a80988b3ef367a7a0aaf7314648aa045d8b8408360b3e4a0f","index":3},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":632,"stacks_block_hash":"0x10691e593ec080176843de41cc5ffcb08f8ff2b53a62d4f3a0a82b9662117561"},"parent_block_identifier":{"hash":"0x1c30d65d440e62370ec97062871021b91380e4c6c9bf990ca188022a7e501591","index":61720},"timestamp":1656419472,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265706c6163657465737432)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":75000,"kind":{"data":{"args":["0x627463","0x7265706c6163657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040095f47112fee93c25463a377a4ed06d5700913788000000000000000600000000000124f80000b99511544ac00db77a616b5bf29ea8d0dafd077077a25e0271274f281deb46f21647f33264f75fe4511dff4bd85c5ab0a4b6adb6d60f158966c0881bff29c47b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c7265706c6163657465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004df04686173680200000000086d657461646174610c00000004046e616d65020000000c7265706c6163657465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a95f47112fee93c25463a377a4ed06d5700913788","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AZ8W8JZVMKR9A678VQMKPGDNBG149QH03QBVN8","success":true},"operations":[],"transaction_identifier":{"hash":"0xe043e170b2620d86125c61ef67db9b7238264a8b501fbcb68d8ae6d9de80a3d9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1761abb21a829d477a178c144474d62cc9de43c4cda5596962012197e797d0c9","index":61851},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000466be79028a8586a59630d0bbe0cb4d5672391f18f6df08bae","index":2283229},"confirm_microblock_identifier":{"hash":"0x10c84fbdd7efba3e3fde0c1285112fce771378ae6381535a05fd148c23e16c0b","index":0},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":778,"stacks_block_hash":"0x7da9de6a67fab1efe65c423cc53da9b0c1d87d8eddad5e6c5fbc02da9d2b2356"},"parent_block_identifier":{"hash":"0x7ca5b4a3d4461ae8d5b9b28096f846bbb6342a93f27272d9f4ca55c28b7b96f1","index":61850},"timestamp":1656486067,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74786661696c7465737433)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x74786661696c7465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003707ed3199373a8305a162cbc24dd7a74cdf4ad800000000000000030000000000000bb800003954f84f321cbe1244d8d778f9491079f0703b11d34409fd8394836ea9a60af2702943da6c59b6f6ab0cb98065e3cc75da956057ad334b84a154b7675e23a654030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b74786661696c7465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004e004686173680200000000086d657461646174610c00000004046e616d65020000000b74786661696c7465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3707ed3199373a8305a162cbc24dd7a74cdf4ad8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STVGFV9HK4VKN0R5M5HCQGJDTYKMSQTAV1YTD3BT","success":true},"operations":[],"transaction_identifier":{"hash":"0x77b8f68e2553d527d916d75e2fae8f6b312a627600845e1e794b3868cd154776"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf52ee7336e74f1e8d2e510433b7ae742f56e2475023a00b139b2f06c85bccf15","index":61895},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000001620a384bfadeba521a56a29457668f84643f47a856739f3b1c63","index":2283275},"confirm_microblock_identifier":{"hash":"0x1a9f137a138a802aedff6c86e3d4ce3854ccc7927ec49fbbe79be78009eef2bb","index":3},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":824,"stacks_block_hash":"0xe8f27047685b77b45dbe298fa628d6b96625b32311857b02ebb400a2cd20e805"},"parent_block_identifier":{"hash":"0xd9348b7c1953dc62d5d06c9efa9824a5e93c813fef47ae75ce3a10c0d56aa566","index":61894},"timestamp":1656511157,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265736574706167657465737432)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3500,"kind":{"data":{"args":["0x627463","0x7265736574706167657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003707ed3199373a8305a162cbc24dd7a74cdf4ad8000000000000000b0000000000000dac0000c499b4e51fe722fe05d6102553811a318dc772e1fb4e10f0994d3ea55d8e66947c5dce6fb80d94606a60c58e77fd724f2e78b4604afde239f1e9ceb07b5149a7030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7265736574706167657465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004e204686173680200000000086d657461646174610c00000004046e616d65020000000e7265736574706167657465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3707ed3199373a8305a162cbc24dd7a74cdf4ad8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STVGFV9HK4VKN0R5M5HCQGJDTYKMSQTAV1YTD3BT","success":true},"operations":[],"transaction_identifier":{"hash":"0x82bda87bfc4fb898dbc4cb6f9c92f75d4fe88e9466ec39a82e8775051f9ec4f8"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265736574706167657465737432)","execution_cost":{"read_count":12,"read_length":43993,"runtime":132016,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265736574706167657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003707ed3199373a8305a162cbc24dd7a74cdf4ad8000000000000000c0000000000000bb80001c7e272a63f375a01be1f0eeee7085e6ee77605dd22b25e17e97caa2cc16969141eddf7973fb155c81f2e0c0f256447b962e7be1adf2c715c6a1a3a5bb80c23de030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7265736574706167657465737432","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STVGFV9HK4VKN0R5M5HCQGJDTYKMSQTAV1YTD3BT","success":false},"operations":[],"transaction_identifier":{"hash":"0x349f30a92c8ac543ae44c85de440443beeb0fa197c86d1df79518e3bf77dbb21"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265736574706167657465737432)","execution_cost":{"read_count":12,"read_length":43993,"runtime":132016,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265736574706167657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":13,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004003707ed3199373a8305a162cbc24dd7a74cdf4ad8000000000000000d0000000000000bb8000069b02e98f504bc559019152a35dcc233f7f3b09bd5549716b264f9c09b7335b52fc87c46d4d5608fdfe82fe734df4e739ff6816134880fce0e977273b7492d02030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7265736574706167657465737432","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STVGFV9HK4VKN0R5M5HCQGJDTYKMSQTAV1YTD3BT","success":false},"operations":[],"transaction_identifier":{"hash":"0xe37831db3c69c23651c0f5bcdd235a9543592be9016158cf2a48c69d26531c87"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x13e868c18da7b6fa6e97a81f0f319d9f48e2094a5296fe805ec5df2d8b0621e1","index":61992},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000004b10ca8827a5d60c3dcdf26e93bb0002da3e39447b29751470823","index":2283375},"confirm_microblock_identifier":{"hash":"0x66cc53d3c63725131b9ae6ff007dfe31ebd1448667db3176a1ac554c44f7baf8","index":1},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":924,"stacks_block_hash":"0x376ef83e8c967abae9b59b72e896d42e23460d667c5235a3772e9fb06cc2f392"},"parent_block_identifier":{"hash":"0xdff2586b4cae1b2f76a60c68bff953cabd37ae774a72ad7f7c530f598514746c","index":61991},"timestamp":1656576129,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265736574706167657465737435)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265736574706167657465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003707ed3199373a8305a162cbc24dd7a74cdf4ad800000000000000100000000000000bb80001ccf04832870123ed688b2f56383fa7b10657dd2dd0a241c31257c81ba703793d6bc6b0f4c432192c3697694286cafc264a15eebb54efbacf0c725ca954fd1e2d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7265736574706167657465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004e704686173680200000000086d657461646174610c00000004046e616d65020000000e7265736574706167657465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3707ed3199373a8305a162cbc24dd7a74cdf4ad8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STVGFV9HK4VKN0R5M5HCQGJDTYKMSQTAV1YTD3BT","success":true},"operations":[],"transaction_identifier":{"hash":"0x65bd7d7a4d5a4574125441507bee5a32548f71bcc008b279ebc4f1c00320593b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe959aff3c8599ba95d0999d5109edd5f3b9e184ec5c447bda4f509cd9987bfa3","index":62006},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002c9d8a9e44c68339ed37864b8fe7ae520777afa3060ea9ea33","index":2283391},"confirm_microblock_identifier":{"hash":"0x6dbc8286b3cb8ab4793e6c448bdfc5b9539badb2d1031e99597ed5aeef7a6fe0","index":0},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":940,"stacks_block_hash":"0x46983ef63c61da04748ad533af17e4d00be3b761753a213f81d0aff3b2e801a0"},"parent_block_identifier":{"hash":"0xb68f3d8cf9b82a228872cba15d1798f4000df5e91194a4ee88f7902885a2476c","index":62005},"timestamp":1656585112,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265736574706167657465737434)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265736574706167657465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040095f47112fee93c25463a377a4ed06d570091378800000000000000090000000000000bb8000148fb638080f3c5a134744a4fa4776ee9f2046f68662e17e64e532a90c5baf6365cea5ab9d0ab9ae39486c17509d07265d9bdde56bdf31cedc2381ee914b17a92030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7265736574706167657465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004e804686173680200000000086d657461646174610c00000004046e616d65020000000e7265736574706167657465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a95f47112fee93c25463a377a4ed06d5700913788","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AZ8W8JZVMKR9A678VQMKPGDNBG149QH03QBVN8","success":true},"operations":[],"transaction_identifier":{"hash":"0xd4ef47fdf0e93dabc7af5796fd710294fcf3b1794ee8f7444f820603493d6482"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7114eba442ce72a07e2e9d673c035f5271d8be280fb8349a01756bd916fa8875","index":62010},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000276d12874b6840ea0d708a72fc6c40af5b15dbe1eb21eb1fd4","index":2283395},"confirm_microblock_identifier":{"hash":"0x1e18e9d13d604c1e10ebd0b4d9f0b12c3e644c503fd4d94f1d6526b2eb27fddb","index":4},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":944,"stacks_block_hash":"0xb0a5f2b37ec153c33c1a0854971bd9f99d0e487ba340e32bbe1a01883126fd51"},"parent_block_identifier":{"hash":"0xf2a264fa20b4f5c84683e79ca03ecd70d9a50b820d9e373da6c69917dd24d54f","index":62009},"timestamp":1656588057,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72657365747061676573747269706574657374)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":3000,"kind":{"data":{"args":["0x627463","0x72657365747061676573747269706574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004003cbb14a97f2ceff24c88411b4df789f7e0dc523700000000000000030000000000000bb800011c439c705376a004a5748ffe67c5186465583c2ac78f524e59bce221c3792bde1beb5a0b380ad775b3a6bd9e0a483108cc3885f5a566172d17cb6f5698ddc46e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001372657365747061676573747269706574657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004e904686173680200000000086d657461646174610c00000004046e616d65020000001372657365747061676573747269706574657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3cbb14a97f2ceff24c88411b4df789f7e0dc5237","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STYBP559FWPEZWJCH10HPKFQH7VY1Q2J6XXB39G5","success":true},"operations":[],"transaction_identifier":{"hash":"0xdce346104d83b98143bbbd3540e62e1c54c147f9b69f0cdd70d0392aa837daa6"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72657365747061676573747269706574657374)","execution_cost":{"read_count":12,"read_length":44008,"runtime":132146,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x72657365747061676573747269706574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004003cbb14a97f2ceff24c88411b4df789f7e0dc523700000000000000040000000000000bb80000e5b9627e54f9997bf0b783fca143ae28da5caed9db89cb7610d8fab2c2350e5c5806a8e85413f368ca41b770b4a9b1e9058a5836b9746f93df07041d17123001030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001372657365747061676573747269706574657374","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STYBP559FWPEZWJCH10HPKFQH7VY1Q2J6XXB39G5","success":false},"operations":[],"transaction_identifier":{"hash":"0xc0c7736ba525a5018b501de87d727dae210d784d3ea51c8e78f0b2cb4d534153"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72657365747061676573747269706574657374)","execution_cost":{"read_count":12,"read_length":44008,"runtime":132146,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x72657365747061676573747269706574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004003cbb14a97f2ceff24c88411b4df789f7e0dc523700000000000000050000000000000bb80001cd1555830530716f3b72c8827096e6a3a5fe54d96b9bc794fcab47fe290aa60f42062850d14d02c95917e1c1032df6839bcf3a287e3811ea3401c2675f87c219030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001372657365747061676573747269706574657374","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STYBP559FWPEZWJCH10HPKFQH7VY1Q2J6XXB39G5","success":false},"operations":[],"transaction_identifier":{"hash":"0x2e11c8c5ab3f9ec26ddc660f93ececcd49e4a07d0b7e3c1edd9617ccd7a2fcb2"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72657365747061676573747269706574657374)","execution_cost":{"read_count":12,"read_length":44008,"runtime":132146,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x72657365747061676573747269706574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":6},"proof":null,"raw_tx":"0x808000000004003cbb14a97f2ceff24c88411b4df789f7e0dc523700000000000000060000000000000bb80001cd52eb69e5b97bf302cb51221904c990657ea80d6190df69fcfa519b6409428c58e972b3ac3a1c30ef2bec2c45f4b301d6034756e8bd89a5d12c29274d956e27030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001372657365747061676573747269706574657374","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STYBP559FWPEZWJCH10HPKFQH7VY1Q2J6XXB39G5","success":false},"operations":[],"transaction_identifier":{"hash":"0x73c0a6daafe89a5fc27254a58c40f2c78a5293a05103b0966720262bc276feb2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x63a346773034436dde4cbb31dc54e996fe19ca3daf5d18bb1a884055adaea9e0","index":62015},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003bd96a33a8a13207195a8d3e1caa43b9b6e5ba3a3c2ad834d8","index":2283400},"confirm_microblock_identifier":{"hash":"0x0f1c8319106928f06192cefd8bf4efe05c7ef2c6f194a2fefcd8ad7a0d554979","index":1},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":949,"stacks_block_hash":"0x97dd19bb3a4ed36a0b9ca1c441c1cff4366e87e396fea3173cc10a0acfd620da"},"parent_block_identifier":{"hash":"0x4cfd5f6861486155c0939fc77b6567a19effc1eeccee14d411be55bb581fcc21","index":62014},"timestamp":1656589524,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x726573657474657374)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x726573657474657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040098b8beb97d13bd1dfa46284b756d80335500eba800000000000000020000000000000bb80000377bd33fade79a1d21761e3930a1103c2eb8b9a15e4c71aea6314b86f2e3883f355a86740d98d4834531b928c25309e7e9763c9a4dd9404dc8d1544032efe4bd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009726573657474657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004ea04686173680200000000086d657461646174610c00000004046e616d650200000009726573657474657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a98b8beb97d13bd1dfa46284b756d80335500eba8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2CBHFNSFM9VT7FT8RM4PXBDG0SNA07BN1SBE5A1","success":true},"operations":[],"transaction_identifier":{"hash":"0xe4de718d53aa003836ec43359043e32f83b493531447459d0b923f4529a32203"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x728edd0402801c19c782120ff36c3fa8b889e89f0c5350d5e03509ef98bc47db","index":62016},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000675481e4d2fb0b9e450f6ca46987cd23f8fc97021dd1a1251972","index":2283401},"confirm_microblock_identifier":{"hash":"0x45d157cd15bc06716ca18c7489d2c753e6a5bd9db5ca1ac29fe3dacadb062bc7","index":1},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":950,"stacks_block_hash":"0x2b5f492a6c7d6ca599f0f811df3cd00f7ee1b4125faff5f9aad26be85d9eef6a"},"parent_block_identifier":{"hash":"0x63a346773034436dde4cbb31dc54e996fe19ca3daf5d18bb1a884055adaea9e0","index":62015},"timestamp":1656589969,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374787472616e736665727465737432)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x7374787472616e736665727465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004002f10526611c31ffc0bb46f90c59de2fd96873cb200000000000000040000000000000bb800007e6f70030c12f6e2c0b70b38c2890ec987b5472aa69981e00d185c92197ce0d917c241ada9a0f6bbc5d26ea191dfe197bcf526cf56aedfbca997a5b1efd5308f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000107374787472616e736665727465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004eb04686173680200000000086d657461646174610c00000004046e616d6502000000107374787472616e736665727465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2f10526611c31ffc0bb46f90c59de2fd96873cb2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STQH0MK6271HZZ0BPHQS1HCXWBYSD1SWP9EJ8MMC","success":true},"operations":[],"transaction_identifier":{"hash":"0x7868621cdb69a0fe0df20f77c0c56312ca9967f81b5e329fe554892d21a4ba30"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8a60c966a19a4e66ba4dede50468261910f4bb2afe8e52eba6a2054eab5eaef0","index":62017},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000006e912245e306d03df097e7a78ad0d3ec7127985456e4db9438a51","index":2283402},"confirm_microblock_identifier":{"hash":"0xe2f872bf5a1832e4c7171e30a16554508aa3f3acbbdd89032d196f59d5765953","index":4},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":951,"stacks_block_hash":"0x59d56716f999a9fb5ae91b1cdc5a76ae81a9fd1cf6f33a17fde6b69ca181b766"},"parent_block_identifier":{"hash":"0x728edd0402801c19c782120ff36c3fa8b889e89f0c5350d5e03509ef98bc47db","index":62016},"timestamp":1656591175,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e636865636b31)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e636865636b31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400796d0666b80b9ee13014d8105f218d536d6d86e800000000000000030000000000000bb80001b83c67f72314362922d0b686840450fa5907211ccd0d7aa7b19e60ab04bc379d0d02db4f732d2c14edb2df41cc7ba29bca127d326fea9cfcf3346e8281e42c68030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c646f6d61696e636865636b31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004ec04686173680200000000086d657461646174610c00000004046e616d65020000000c646f6d61696e636865636b31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a796d0666b80b9ee13014d8105f218d536d6d86e8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1WPT1K6Q05SXR9G2KC10QS1HN9PTVC6X0D4HMRM","success":true},"operations":[],"transaction_identifier":{"hash":"0xe9308d5c27678fd76e1ad71438f8c6683614a058a439430ecab7ec6a96160570"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e636865636b31)","execution_cost":{"read_count":12,"read_length":43987,"runtime":131964,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e636865636b31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400796d0666b80b9ee13014d8105f218d536d6d86e800000000000000040000000000000bb800011d32507982d83d432cb8e194eee6efb16fa3221639cbf42e48f88937ea4d4cdc043f35d29c09cc2e07a386bc06f2fd402a27f2aa98ab37123cfdb61f9809dc44030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c646f6d61696e636865636b31","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1WPT1K6Q05SXR9G2KC10QS1HN9PTVC6X0D4HMRM","success":false},"operations":[],"transaction_identifier":{"hash":"0x05aad402f922b31c8397801c334e171f1402d990611520b0c102d406b4ff92e8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb5b8e1adb6515bada04c90e61346c700987ab315a8aba1bca57aec61d672bfce","index":62020},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a93dd66852af1a0c00889602a470383fc955d0be929e58fd8","index":2283405},"confirm_microblock_identifier":{"hash":"0x3a99aeb54d8ddfda5d8c5bbd3f58a6b7bc0caf2510edf8383b01dcbeb0f94d77","index":2},"pox_cycle_index":269,"pox_cycle_length":1050,"pox_cycle_position":954,"stacks_block_hash":"0x5e4a33a8190dd6b9a5f9693079e97056d8e0debc54b1ea312b453e6a64596f56"},"parent_block_identifier":{"hash":"0xbba9c6f439aa67502ed92aca6a8a40cc72ef417d1ec9cbe0a49dbef7dabebf91","index":62019},"timestamp":1656593224,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a7573746173747269706574657374)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167425,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a7573746173747269706574657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004001146a74c16e3590ec0f60e0a2359b102cfc2a82100000000000000010000000000000bb8000113b7b4c2774e652bcb576ccc2fc7443a0a85eec0924c26296328ef69309cb375391199beb98f16851855e47fc7e30ef8d94010aaee572d1170dcc10c0e99e782030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6a7573746173747269706574657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004ed04686173680200000000086d657461646174610c00000004046e616d65020000000f6a7573746173747269706574657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1146a74c16e3590ec0f60e0a2359b102cfc2a821","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST8MD9TC2VHNJ3P0YR70M8TSP41CZGN8464EC5WX","success":true},"operations":[],"transaction_identifier":{"hash":"0x14d8e40c8f80a35bc3b505d3b12a14d48dbea46422c2086d78569e5ce6ae9abe"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a757374617374726970657465737432)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a757374617374726970657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040072700a9e0971d480610460b6ad684fa418afb6b400000000000000010000000000000bb800005da276857734ef987f2d954fd6c6f045a05281cd30dd56735db6d499fa7e906f63057f8145495274a9140a5e133f1c186f668fdb5a99ece4121dcfa94706edd9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000106a757374617374726970657465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004ee04686173680200000000086d657461646174610c00000004046e616d6502000000106a757374617374726970657465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a72700a9e0971d480610460b6ad684fa418afb6b4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1S702MY15RX90310HGBDBB89YJ1HBXPPH95QAT0","success":true},"operations":[],"transaction_identifier":{"hash":"0xf06ad5347d864fbc639ef80209aa5fb579a9b5acf06b76f73f77337874e80798"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc6c5942a45732c661cb01171eb55f34717d61cc0ce47ff2b12d6ede9a3a17909","index":62572},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000045e43ad4598e5f1ad2ab3025cc360f4e447f31373a2c7c1ed3","index":2284019},"confirm_microblock_identifier":{"hash":"0x04bde165c4f3e1789da9cc6def79eed7f9564559c8e78d96e30ed4354ff86a99","index":0},"pox_cycle_index":270,"pox_cycle_length":1050,"pox_cycle_position":518,"stacks_block_hash":"0x5bc9b935a0e8719604d5ab197d64f1285a501576b7d39913ecdbc0d5cb8164ec"},"parent_block_identifier":{"hash":"0x30162006ab068f009a36b104c29d5ed6ba37e87668e75124e278acae57b66772","index":62571},"timestamp":1656925221,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7072656f726465727465737433)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x7072656f726465727465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040095f47112fee93c25463a377a4ed06d570091378800000000000000100000000000000bb80001e8e11617da7885c0f98201e104c2bd0f61c7115ecc8ba5684dd640ee416fca265f2a836b0252a42912e131d242ffef67fd176b8176dc4845a2e1392fdb48f00d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7072656f726465727465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004f404686173680200000000086d657461646174610c00000004046e616d65020000000d7072656f726465727465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a95f47112fee93c25463a377a4ed06d5700913788","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AZ8W8JZVMKR9A678VQMKPGDNBG149QH03QBVN8","success":true},"operations":[],"transaction_identifier":{"hash":"0x2597aa8528c46a1d4587d7ca7e075e48a77096293f06d3e55b515678bb4cee7d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1216d61f7ca074892499be50b79547e1649fc17d4b11c7c2749bb8019ab9bfdc","index":62735},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a6485cc762b14a66bd5b2974062884aa71aa7838156c626b2","index":2284195},"confirm_microblock_identifier":{"hash":"0xc575829c2d2ec4ab70de7eacf861f68293fac87a49b04573905b40848d110f3c","index":0},"pox_cycle_index":270,"pox_cycle_length":1050,"pox_cycle_position":694,"stacks_block_hash":"0xcd2115efbd7bae7d73a92e256981e452122f73c61993776d6847661dbbe6b410"},"parent_block_identifier":{"hash":"0x2f229f05074c9c42f409a6c5333ad0fa03d2423f5039424d73260f4fe30041b7","index":62734},"timestamp":1657014407,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265706c6163657465737472616e73666572)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167542,"write_count":2,"write_length":169},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265706c6163657465737472616e73666572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ae51689b808646c2c27fa2c90778408ded42107b00000000000000000000000000000bb800011104d8eef9b03632014c1c419d58770e7f2254a0c475f486cb0aeeb0b9accc7409d38aed66898c146017cd4ce1bfdc3b094513302ead567fa01720716218a6d1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000127265706c6163657465737472616e73666572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004f504686173680200000000086d657461646174610c00000004046e616d6502000000127265706c6163657465737472616e73666572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aae51689b808646c2c27fa2c90778408ded42107b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2Q52T4VG234DGP2FYHCJ1VR826YTGGGFEMN94GG","success":true},"operations":[],"transaction_identifier":{"hash":"0x7ce0d51e269c15db22ae9466f50481815bea3f34a5e37745bd9bc3b3c5c94381"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x24737699461c33b6488a4be63e548f4c925aa701feb907a2a71f60a91b5b7ce9","index":62879},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000010deab143b7a24b072b74693c66c6678d1a5b7a9a168945094","index":2284345},"confirm_microblock_identifier":{"hash":"0x656f7850836b753fe5c2de4c7d288baf1c286cb22f588e54eca556bea59f6ee0","index":3},"pox_cycle_index":270,"pox_cycle_length":1050,"pox_cycle_position":844,"stacks_block_hash":"0x100e6538974d37db4fa4fc7de593b315fa38fc1c3c97c13c70b11be5b0c2a254"},"parent_block_identifier":{"hash":"0x9a0a813f5aab6249b7b90d39b3773362801de53e3dbafa0f3e90a4e16754f6b9","index":62878},"timestamp":1657103692,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77617161313233)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x77617161313233"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":13,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400e9ee5be86ec9e38e491aef3993dc1c248d2bf7ba000000000000000d0000000000000dac0000ed235e7cf9d043c8b3f5a2d71dbdef4aaf326854a3d01a835717d02923a488973a8afe2af84fb8aeaa336da476f4874d7c80c7b228923dc21f78d8ba36041529030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777617161313233","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004f704686173680200000000086d657461646174610c00000004046e616d65020000000777617161313233096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae9ee5be86ec9e38e491aef3993dc1c248d2bf7ba","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3MYWPZ8DV4Y73J93BQKK4YW3GJ8TAZQQAFSRYNS","success":true},"operations":[],"transaction_identifier":{"hash":"0xb6e0ca0dd8dc4390a37f4b1ec8b5df3c42f1858936805f7f0f5e29e9c10a8140"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77617161737465737431)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3500,"kind":{"data":{"args":["0x627463","0x77617161737465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400e14cac7d41bd3c6e0a823ae48274f018c9693ef900000000000000050000000000000dac0000c3731d563a62b6226185a288f8fdd3e5f37650818686faf42e222118a0646f0579e78218fc9d4e2718d47c076089eb249f5012eb6b82e60380ede5abf163baef030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a77617161737465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004f804686173680200000000086d657461646174610c00000004046e616d65020000000a77617161737465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae14cac7d41bd3c6e0a823ae48274f018c9693ef9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GMSB3X86YKRVGAG8XE90KMY0CCJT9YZ723KYKA","success":true},"operations":[],"transaction_identifier":{"hash":"0x78dbf1e01821f739e9a25bac020fd24b34d3cd62dc4d311b1353c7c6ee703e88"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf42bd38bf7d0bd4398ae179e016ec15261045048f847fe6566cdc0852bde786e","index":62884},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000378d5b0df7d6d4b4a4c21f902abe0f1067591a0e45078ac3ba","index":2284351},"confirm_microblock_identifier":{"hash":"0x3546161b7da9ac600dfef938c6f58e919aabafb3f22966a258281b50a1232408","index":2},"pox_cycle_index":270,"pox_cycle_length":1050,"pox_cycle_position":850,"stacks_block_hash":"0xdb3dfeca03ad002b78414a548c3c426c0824afaed36d9709d82e8467b48f8ddf"},"parent_block_identifier":{"hash":"0xa0295ae402e2c47e83577445bcec48cd2bbd5a55942a354e11b1c18632fd45e6","index":62883},"timestamp":1657106243,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x776171617374657374)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3500,"kind":{"data":{"args":["0x627463","0x776171617374657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005cd708cae3bfab26be5838dd1080b274f4d4105e00000000000000040000000000000dac0000c5fd6148969811401ee54aa897f8de95ef28d94d31550cf561272a61b5a9d32a7ef7769eb9d14c24ace68896f6793e0584a458a8fff6bfa1d8261c053fb3427c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009776171617374657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004f904686173680200000000086d657461646174610c00000004046e616d650200000009776171617374657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5cd708cae3bfab26be5838dd1080b274f4d4105e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EDE26AWEZTP9NYB0WDT440P9TF9N0GBSVH21VS","success":true},"operations":[],"transaction_identifier":{"hash":"0xab11a7fd318f6ae071af0089f3dcf6e0c442a429daf8c3a894997d6d6ad5114e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa74d2c9e47e942e4140be6ae689a4ca769f7ad2408f9beea993b7ddce9f70f1e","index":63017},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000e6f797c1533d803e76ab9859f6da713e6ac4d6a3125a65764387e206","index":2284495},"confirm_microblock_identifier":{"hash":"0x5d3e16d406491996c4134945a2468cfefea43ab29977253f14b313af26d6cbe6","index":1},"pox_cycle_index":270,"pox_cycle_length":1050,"pox_cycle_position":994,"stacks_block_hash":"0x366b8aa68d58034523bdeed776f231e4e12836f90d4532fa23ca05f68ec404e0"},"parent_block_identifier":{"hash":"0x36a7faab4c1725b0a79175da7e2ed4802e9208814d06a211a4538d1631afd6b2","index":63016},"timestamp":1657192172,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737462696c616c33)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":6000,"kind":{"data":{"args":["0x627463","0x7465737462696c616c33"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040054d504ed798a864a3da562d67578409ec6ec873a000000000000000000000000000017700000e6fd898a1de8f65527ffefb2335faf5ec7c162f3c07d07307280179de078afe04cdf78cfb768298eeaf4d16987e966e1995ef15524f31be40af691199a1b9bb3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a7465737462696c616c33","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000004fa04686173680200000000086d657461646174610c00000004046e616d65020000000a7465737462696c616c33096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a54d504ed798a864a3da562d67578409ec6ec873a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ADA17DF658CJHXMNHDCXBR82FCDV477BMD3JH2","success":true},"operations":[],"transaction_identifier":{"hash":"0x2c6d1fc63327555f954b48064d2497b7385c8812105ecb5f78bb8fd833478d35"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5db7c9a764dd1e4978ed127e9c69560959caf391c980a60da538355bde1bcbca","index":64072},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000014b5dc09f9fa441f4a524efb7894b2bef0dce545c58519e691","index":2285686},"confirm_microblock_identifier":{"hash":"0x607e67defda4f5ccdb1509fe95733e8bc914c61365311abf1b554fb34ed5cd65","index":1},"pox_cycle_index":272,"pox_cycle_length":1050,"pox_cycle_position":85,"stacks_block_hash":"0x3374c9fbf980e82038e90074bb512ef79cfbb37387fd229c26b1943d587a0f88"},"parent_block_identifier":{"hash":"0xc4c2d3950de4e46cc26cef7ffcb94aa0d2639ae55f180f5d907453b996ff91a5","index":64071},"timestamp":1657702847,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696e6372656d656e747465737431)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":6000,"kind":{"data":{"args":["0x627463","0x696e6372656d656e747465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000000000000000001770000151f90f0c03527f75979b0be7b864c34d31f7e3bdf623f0c440dda7ccf11c4fea1fe71932025154ac5b608f1692035dc2a551d88d95db00f84dbea5b6dcf366e6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e696e6372656d656e747465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000050104686173680200000000086d657461646174610c00000004046e616d65020000000e696e6372656d656e747465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0x5a96523d2079fd5836dc73caded2f3f4cddca6c3090871857c5fbc585825070d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf7139ea2a240eaa17976aaa8c10ea24835f6549d1b4c314b446fcb02a7c6677d","index":64378},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000061152a6c08b38f630c076ec92b53bf783b77434a2131795989a31e57","index":2286038},"confirm_microblock_identifier":{"hash":"0xe153a43f953cbe7838364db82a67b12cd21a1f82335962f920288beea96d5536","index":0},"pox_cycle_index":272,"pox_cycle_length":1050,"pox_cycle_position":437,"stacks_block_hash":"0xf22b3325bbbfc4b113218535c43e72e6f9ba4a7a5d00021b40eb3ac312116bd5"},"parent_block_identifier":{"hash":"0x381d53f3b4c6e52322d6477e6dbf9aa1e29949a668ff6698022fae8a1783fb4c","index":64377},"timestamp":1657871132,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7761716173313233313233313233)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3500,"kind":{"data":{"args":["0x627463","0x7761716173313233313233313233"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005cd708cae3bfab26be5838dd1080b274f4d4105e00000000000000070000000000000dac0001ef4743356b097bd672511001e752d3e28611cd937b1175a7b45f7c2864154a4430ec581a3655fdaba5eb72bc682a58d7311c24392243a1681576cd032f15cfd5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7761716173313233313233313233","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000050804686173680200000000086d657461646174610c00000004046e616d65020000000e7761716173313233313233313233096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5cd708cae3bfab26be5838dd1080b274f4d4105e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EDE26AWEZTP9NYB0WDT440P9TF9N0GBSVH21VS","success":true},"operations":[],"transaction_identifier":{"hash":"0xb4d0b4fdfb737bb46784346fa1af7eeed322c05a789aab0aeed4cdbd0b90a227"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd4b766d3aea888f32a3b99d656929324e06068cb68bd40bc97af7ac165ce1e47","index":68292},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001cd88a1503df4bf88feabf6abfa0a06180246bd695830fa308","index":2314465},"confirm_microblock_identifier":{"hash":"0x233fdb18021b8912cc691d3d5e20cc216b4513409065842e0548fd589d03dd82","index":3},"pox_cycle_index":299,"pox_cycle_length":1050,"pox_cycle_position":514,"stacks_block_hash":"0xe19cc24446b9067444543092e080d5ded781fde032aa5c92bb75b8a0faf08048"},"parent_block_identifier":{"hash":"0xfd42f0f4d3eef0646e2d15672d91eddf27b2c292aa3567554ba4b88568974abc","index":68291},"timestamp":1659424336,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737431)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x65646765636173657465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400254a79735e9607369e43e909c2d3991d2d415bbb00000000000000000000000000000bb80001ce847fe074ead250ba1017145b1ce522aa34d9f51bf4c2a470836eb6519b695708b738b93bbb0a168f1cf8b3cff257ed694239b20a1dc35b8872711bb1c904ed030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000052504686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a254a79735e9607369e43e909c2d3991d2d415bbb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJMMYBKBTB0EDMY8FMGKGPKK4EJTGAVQDW8KGP5","success":true},"operations":[],"transaction_identifier":{"hash":"0xf14bdb704e9e9ab8f33f397a4e609da2968efb307c5db1c066618f8ab31c276b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x952adb2d692a5376b2bbd7fb91560cc99a48b9191ad52681b9ed5f5b71578a98","index":68297},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001cd11ea63443a61a0c8269db04ca6dcb9b02d1be967f65a62b","index":2314470},"confirm_microblock_identifier":null,"pox_cycle_index":299,"pox_cycle_length":1050,"pox_cycle_position":519,"stacks_block_hash":"0x5dedb5621429b57ccf8674479fe7030d705020afde5a2ce2b48aaf51aea43a4b"},"parent_block_identifier":{"hash":"0x527e9bd31dc3694ac0f28b1fd332a460925c3ed19f59bba5a8167cdf593bef50","index":68296},"timestamp":1659428740,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737433)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":2500,"kind":{"data":{"args":["0x627463","0x65646765636173657465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400254a79735e9607369e43e909c2d3991d2d415bbb000000000000000300000000000009c400019e4e2fa17d6746b5610323ee53cb180c874033aa75a7b9098dc541eb88d34e3635aa5d1ab510e746341dbf77bf9448905a587226b637be887132e62e4d7f737b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000052704686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a254a79735e9607369e43e909c2d3991d2d415bbb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJMMYBKBTB0EDMY8FMGKGPKK4EJTGAVQDW8KGP5","success":true},"operations":[],"transaction_identifier":{"hash":"0x32a4aea72e9cec01930eb62da88d151767518711c16083218c3eb343e3e71e2d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdd01c367a0f071af1b02620f005c05815a8e928d2a80f2d4b3ab5037e9ea00fd","index":68337},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000007589b61baef17caa1a6e0a9c2321822d54f1f1eff4cf625bfbc8850f","index":2314512},"confirm_microblock_identifier":{"hash":"0x0c7474f08d153bd4e391bfc2df87dae46f253df21fa8b025834be6e8289bcd89","index":1},"pox_cycle_index":299,"pox_cycle_length":1050,"pox_cycle_position":561,"stacks_block_hash":"0x93ba9a3889471b9d09aa97c59fe2cb588de387b85a1ca1ee402c4d650daf432a"},"parent_block_identifier":{"hash":"0x9818dbe495da6bc95b709051f14bc533deafdd39cbd7db2983e80d5d4c9dbc57","index":68336},"timestamp":1659452381,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737434)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x65646765636173657465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000f465dc179e93cf89048480bef835311ab72cad500000000000000000000000000000bb800009a6c8804ef5416387a0e99283bda37f69ced3431cb2bdbce6cd97bb447c42d333b6f7d4346203918925fe809c42ec3eebd79749001aafcf7ee83d5288cba0c31030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000052d04686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0f465dc179e93cf89048480bef835311ab72cad5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST7MCQE1F7MKSY4G9140QVW3AC8TPWPATP7K7TNP","success":true},"operations":[],"transaction_identifier":{"hash":"0x2a4ba523c601cb2b21d1e454e89634ac711a1bf1a9175758bf61346bad68c156"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2d288853380fdcc3846f870871b45702e7017ef8dfb51dc44c58775f55cf096e","index":68486},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000030ac001db2112a448da12bc435682b26ffb2b435bc050d1136","index":2314675},"confirm_microblock_identifier":null,"pox_cycle_index":299,"pox_cycle_length":1050,"pox_cycle_position":724,"stacks_block_hash":"0x2b5341602ff5977eab9fe195250d1d9cbbfd81cdcd596596175d3b5acdc05663"},"parent_block_identifier":{"hash":"0x1cee77181492f51cac65575fb91bbad6c861dbc5d03fb51177a9b70040dc79b2","index":68485},"timestamp":1659535053,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77313233313233)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":30000,"kind":{"data":{"args":["0x627463","0x77313233313233"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e14cac7d41bd3c6e0a823ae48274f018c9693ef90000000000000008000000000000753000013e507d09ec7c8a5d49513ab9c156fb921934e5db3043d2d2e25d39a121e4c33f7dbd5f4b9260ffc021c9c856bc0edde69100d56201898cb61163786eb6831b3a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777313233313233","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000053004686173680200000000086d657461646174610c00000004046e616d65020000000777313233313233096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae14cac7d41bd3c6e0a823ae48274f018c9693ef9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GMSB3X86YKRVGAG8XE90KMY0CCJT9YZ723KYKA","success":true},"operations":[],"transaction_identifier":{"hash":"0xb96cfc6853d478933b1a7fdb7090660d936b37425752fa325609a34bb5ebee19"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x57a65ed08eb62bfcacefe0d066e6cbdd1c735cefbb8024d2acfd4bfa5c2a2b55","index":68496},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002db8f41a3a5306488c73eef6b51050156e6cca7945d48a98c0","index":2314685},"confirm_microblock_identifier":null,"pox_cycle_index":299,"pox_cycle_length":1050,"pox_cycle_position":734,"stacks_block_hash":"0x19ff5fb01258c5531303153c9400a0c7035dfc65f330a359501f78c06f37c331"},"parent_block_identifier":{"hash":"0x1724575b47e2c75e6c9e1ac5d606457d84d62fa500c19e202621a4588b65be7d","index":68495},"timestamp":1659540052,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7177717765)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x7177717765"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400dc228d23098159e62ef42d1261838ab1af15a6df00000000000000080000000000000bb800002c3668031e01491719f137fd657cb893e3ed205de060a7c9a4eb26f9dc9c90180b723f3cc6e4e970f5c205b04d1e4c1f8be8be2c69bd43f5dbb530428d97538a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057177717765","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000053204686173680200000000086d657461646174610c00000004046e616d6502000000057177717765096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adc228d23098159e62ef42d1261838ab1af15a6df","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3E25393160NKSHEYGPH4RC3HARTY5D6VWN1TS64","success":true},"operations":[],"transaction_identifier":{"hash":"0xb555e9bc0ad953024fb243cb4537baba80319b5deaceb112fd78e426e1965355"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x450c309a4e4a0153f931ae94638962b2fa3b8b02bb700be60069f6099748373a","index":69445},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000014134a98e42060b84c75b4d6563aa67e91112b62df672d79a9","index":2315728},"confirm_microblock_identifier":{"hash":"0x49e9ac680aab9c0f5d74076ced07a4dd8cf02827db310509cb18007c84f5939d","index":5},"pox_cycle_index":300,"pox_cycle_length":1050,"pox_cycle_position":727,"stacks_block_hash":"0xef9fa964de80aeb8e77bfbbe0c1dfc3d7861f9df626dbb64e028fa9c30cb9787"},"parent_block_identifier":{"hash":"0xac7cea6edc3046034cd5e5f38a5b0b1ceaf06c4e8cd8a0e37dce44257784d56a","index":69444},"timestamp":1660145350,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7761713233)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":15000,"kind":{"data":{"args":["0x627463","0x7761713233"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400dc228d23098159e62ef42d1261838ab1af15a6df000000000000000c0000000000003a9800012e284eddf06e459f5e214fed29820a72d70e0c566bbaa905446f03053b7bfc0d13e5227d6062f575be4f66712c4f9195af213af59de11e6aa2633053e2df3b15030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057761713233","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000053a04686173680200000000086d657461646174610c00000004046e616d6502000000057761713233096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adc228d23098159e62ef42d1261838ab1af15a6df","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3E25393160NKSHEYGPH4RC3HARTY5D6VWN1TS64","success":true},"operations":[],"transaction_identifier":{"hash":"0xe424ec42ce0fa21f351496f452dbf696b459a46a0aa0b635a09a6a1561ad0506"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb0888e1836c7c13c3094c0c71c352c50bf22d561db654111c08f99838188e484","index":69552},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000012847e556717f97491ab144bec8383fd70a67103463c3e6edc","index":2315842},"confirm_microblock_identifier":{"hash":"0x3cc8f3015c86854cdb4064110276155f328847cd44c5b64205b5e784972539e7","index":4},"pox_cycle_index":300,"pox_cycle_length":1050,"pox_cycle_position":841,"stacks_block_hash":"0xdd7930547fcb9a96b33034eebb06482e27650422fcd7dca62aa96cc1748e9a0f"},"parent_block_identifier":{"hash":"0xffc231964510c52ac652b70b59f6e9892e6760f85b8969eae0c90d70200d2b92","index":69551},"timestamp":1660203451,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737436)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":6000,"kind":{"data":{"args":["0x627463","0x65646765636173657465737436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004007fcffc72ddb02c593de923c8e695954ded7645740000000000000000000000000000177000011e7d45dbf18c1f43bb975567ba2c1e291181f84e656b5f40fb8502ca440022d255e2fcb6319e9e97ae6268076c3f23e17e8d09d5d74e077295365b18c3b40e70030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737436","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000053c04686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737436096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7fcffc72ddb02c593de923c8e695954ded764574","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ZWZZ3JVPR2RP9XX4HWHSMNJN6YTXJ5EK491FVB","success":true},"operations":[],"transaction_identifier":{"hash":"0x77a9cf1900d39a20c42284ee881bbdc47c96e02f9c01426a4bfed420a7629c4a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6cb8df742b4215b1d37d7ec32ca22ef47a9d9ce1779126303e5d172c429dba5d","index":69558},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000037e69c5e2bcec5bd5789bfadabb9a5d236728d629447c57cf","index":2315849},"confirm_microblock_identifier":null,"pox_cycle_index":300,"pox_cycle_length":1050,"pox_cycle_position":848,"stacks_block_hash":"0x4439d88f7f36a5d96cb498320a3f0f7e7c384bf660f05f00a78591f85637a8a8"},"parent_block_identifier":{"hash":"0x557d9cb5b3e9902683bbdd820d0ba71e8c673a028ba485cda1b0f413d26a9de0","index":69557},"timestamp":1660205246,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737431)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":6000,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007fcffc72ddb02c593de923c8e695954ded764574000000000000000300000000000017700001ba7e6bfd5b970d7c203a79574352b833f17f7a892d8fcb3632185f2da7cf46b4275174d616dc343e29b192bf013ba8c3ea5fb05204f8ab775cf17be5dddfb8a7030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000053e04686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7fcffc72ddb02c593de923c8e695954ded764574","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ZWZZ3JVPR2RP9XX4HWHSMNJN6YTXJ5EK491FVB","success":true},"operations":[],"transaction_identifier":{"hash":"0xc620a160b4fee713b736117a16116bf3e69fe415979bde692b5caeb9d7177a1b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe10bde7cf3f743e0c0da9e50292d793708c0fbce1a12d973988de43f99699ccf","index":69568},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000eb7971e880619d9f8e5fe374505a6c204ab0298d184861aa2343dc76","index":2315863},"confirm_microblock_identifier":{"hash":"0xe8685d7ef6e515eb53f97aa66d1506237a1725985a7a15664ea15f648c852ea7","index":1},"pox_cycle_index":300,"pox_cycle_length":1050,"pox_cycle_position":862,"stacks_block_hash":"0x7da3b40178c34f93924a8746c00c1bdf676fa3672612c752ffa8f125845077d6"},"parent_block_identifier":{"hash":"0xee2cabe6fbbac0975d50d6eedba6517d0937bf5672a660e1419e9634fd7feb97","index":69567},"timestamp":1660209134,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737432)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":6000,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007fcffc72ddb02c593de923c8e695954ded764574000000000000000600000000000017700001a016bd0d00f0aabcafd04ce4b6d7dceba77b5b496253fb35129f852138bba73f56cccba0013107c30a013bfe0196381b3ffd718dfd596390ba7997d21b11e4c2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000054004686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7fcffc72ddb02c593de923c8e695954ded764574","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ZWZZ3JVPR2RP9XX4HWHSMNJN6YTXJ5EK491FVB","success":true},"operations":[],"transaction_identifier":{"hash":"0x2dab8ef6c5ddd54111a03c72bbf0a20330d02ed34df39c1a5867e5b567f65d8e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x42cc621e199d962349ec5f78475189400dfef46030b19e6d7507821104d011f9","index":69898},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002a7ce623f7324f9b9809b64ded58149bba576c0f3e958a8a7b","index":2316228},"confirm_microblock_identifier":{"hash":"0x898ac06255fe12d781498b294502ebbb243d36b5a7530cc2e1e1983187a26960","index":0},"pox_cycle_index":301,"pox_cycle_length":1050,"pox_cycle_position":177,"stacks_block_hash":"0x883d6b961e024848c1494573518f289ab228ea4fdb54789a30917d224907e059"},"parent_block_identifier":{"hash":"0xf041988f4bf36b18ae7dd626bb42583c5c87b98f67bbeb36e635a92a9fe9e308","index":69897},"timestamp":1660393010,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737435)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":12000,"kind":{"data":{"args":["0x627463","0x65646765636173657465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c8a53e382581442ac201705dd4fc89e2478b89b100000000000000110000000000002ee00000459f1119bb1cd762f24bac1951cf41a679fd9264294b5993bb2499e573fb76cc5189225f58eebe08d67ac5b1ef58ad19b5bc8784553b1adb567f035d180c3729030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000055c04686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac8a53e382581442ac201705dd4fc89e2478b89b1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST34AAFHR4P0M8AP205R5VN7WH7H4F2W9P4V4PTT0","success":true},"operations":[],"transaction_identifier":{"hash":"0x9b25bda445f0b3194ffeae2a4eca2b9130b350c1f469092f4a8a60e956a45e11"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd810812bdafd85168480bd21d070f15ceeefc75eb2b94917eb57aa44e3308f5e","index":69902},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000012ae15d9a260f093b00e28b880f6b4ad5454316a5cdd304192","index":2316233},"confirm_microblock_identifier":{"hash":"0xebc81d461471664d56d40e1d783617b2a2692102aa170b57a8c3a12128573e00","index":0},"pox_cycle_index":301,"pox_cycle_length":1050,"pox_cycle_position":182,"stacks_block_hash":"0x67c6dc1bfa20511c8b0273942241fcdb77797153a04d2e7d03dcfe6f41a13e5a"},"parent_block_identifier":{"hash":"0xa2bfdea94afc32ba46b9d38ea43b5ceefbebb1967dbaa1feae57eb5cc716069d","index":69901},"timestamp":1660395382,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x3137)","execution_cost":{"read_count":4,"read_length":41790,"runtime":48292,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x3137"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400261fbb54427f9495c8f28a26963c8f5d7d82bdeb00000000000000040000000000000bb8000087c8868cef6dc3c41b3ed905a0bb826c66ea242574a62e19db9183e8adb0a12a7c7c7aca03d8db024eb9d3fbb1be099fdeb76ac16739b03a4ec77e38eeb59aa1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000023137","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2013)","sender":"STK1ZETM89ZS95E8YA52D5HWHXEQV0NXXC3F8AYT","success":false},"operations":[],"transaction_identifier":{"hash":"0xf68f91659636df54bea2f1a3d2a49e75b36669cc03c0934372c09ec6eb104bb4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1705d354d4cff753ef30a20f0b3a605a64cfc158c5828573ef1cd5588c3cd695","index":69908},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024149ca47604a5ae24c6f8b29ac7b7da9966e2f0eff030ef7c","index":2316240},"confirm_microblock_identifier":{"hash":"0x9764aedf5b798a38da0fed51480ed8b6a208a752d44dfad0408f6aee5b723f47","index":0},"pox_cycle_index":301,"pox_cycle_length":1050,"pox_cycle_position":189,"stacks_block_hash":"0x49dcc8184450cbe556cab257618b1923488ee6b11c4fcf9d432765272315c88f"},"parent_block_identifier":{"hash":"0xe326844013ed993fc0b6aa7b046666cb7f72fc987244684db07efc84e15be1f0","index":69907},"timestamp":1660397787,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737436)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c8a53e382581442ac201705dd4fc89e2478b89b100000000000000140000000000000bb80001dd1f104cce5ca8d6e5b9529f09c445a0d431bb2e15d44416eb3cc53029306e9d0356dba5c65e1d8777d4e2120aa2ae6f0e071fe952090975d61237fdf4b842d5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737436","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000055e04686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737436096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac8a53e382581442ac201705dd4fc89e2478b89b1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST34AAFHR4P0M8AP205R5VN7WH7H4F2W9P4V4PTT0","success":true},"operations":[],"transaction_identifier":{"hash":"0x966d0c577e838f3ff617eacb46cea2960983303878df76c674ea25c918f97ad4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc1e8faf25001332d7553de1ce28e900e484eed35a32b202f6ee53904f118241d","index":72579},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002e61c9e7d342a92bb941f13de093723c80f323ee695bb8d017","index":2343720},"confirm_microblock_identifier":{"hash":"0x0cb93422a7331aa474faf8a8efe7e7b78de696d793e62f364f6047f5b9cf83c9","index":0},"pox_cycle_index":327,"pox_cycle_length":1050,"pox_cycle_position":369,"stacks_block_hash":"0xd5610a17c3fe72edf46348061ae3b54e96da3b0f127e3a0ed9a8ca07d43dcda4"},"parent_block_identifier":{"hash":"0xa6491d78513f13ba90bf4fbe23c23165e0c85a07838012502d5e35b95550d53e","index":72578},"timestamp":1661339356,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f70757074657374)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":6000,"kind":{"data":{"args":["0x627463","0x706f70757074657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400254a79735e9607369e43e909c2d3991d2d415bbb000000000000000f000000000000177000006db401525186994f10e08ff640bf10dad50f217b5e458a9577a25384b9a534a678c546f6a89183b81092ae12f0bc1e19c45e6adfac55eab1d3562778064adee3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009706f70757074657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000056d04686173680200000000086d657461646174610c00000004046e616d650200000009706f70757074657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a254a79735e9607369e43e909c2d3991d2d415bbb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJMMYBKBTB0EDMY8FMGKGPKK4EJTGAVQDW8KGP5","success":true},"operations":[],"transaction_identifier":{"hash":"0xb6548b678950edd9ce9cc97583401e040754a8271d6b43dd3c7fdc1489e04f08"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x828f1b92909d14bdfc29c0b8439f0a01765e30c20871b9cb0a2e033a320adc16","index":72586},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000009547aabc5f27b8b1f4401f76cacf32ec3cb634009de8ec8dd3bee","index":2343727},"confirm_microblock_identifier":{"hash":"0x7e1968e5dc851d34b011976ed8c2f6be2362e3783f28cdb02ddc83af081a6ec5","index":2},"pox_cycle_index":327,"pox_cycle_length":1050,"pox_cycle_position":376,"stacks_block_hash":"0x9e55cd2f09a74c55f11a3cfee15e687b0e7b928b5701815c96e8cc0b0973873d"},"parent_block_identifier":{"hash":"0xa20437abd986de9419cdfe169235d00bdbb3e09b891988ea40794e670fe6fdb7","index":72585},"timestamp":1661343379,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265666163746f727465737431)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":6000,"kind":{"data":{"args":["0x627463","0x7265666163746f727465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400254a79735e9607369e43e909c2d3991d2d415bbb00000000000000120000000000001770000074a1811b59eda5caab10271a84f706e952636780aab1f5feabd9876cd5a633163ca28d1f12a689bcd42ae426ae92ebed82c4d727ca55da6751747198769f4a15030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7265666163746f727465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000056f04686173680200000000086d657461646174610c00000004046e616d65020000000d7265666163746f727465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a254a79735e9607369e43e909c2d3991d2d415bbb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJMMYBKBTB0EDMY8FMGKGPKK4EJTGAVQDW8KGP5","success":true},"operations":[],"transaction_identifier":{"hash":"0x238b2bec77a53cd430590625d5d16e98effc3f4b3d17392fce2c549314640cfe"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x173a4a3b45ca39d865ada8dc74bcd9c7ab4447383c6b095eb0d02cba0e421b2c","index":72732},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000355bccd8d5bc0c817624c2f0bddfbdb7583abce1ce3438a176","index":2343896},"confirm_microblock_identifier":{"hash":"0xff2c02f3e24ac17c3f89dd7f7bf032e8df7e349a335ffdb065fb7c1211a22a2c","index":3},"pox_cycle_index":327,"pox_cycle_length":1050,"pox_cycle_position":545,"stacks_block_hash":"0x52369268c0196678a3a6be0e96877b624205369e73c3227230624d1d26450ea3"},"parent_block_identifier":{"hash":"0x682b0c1a2387bb8ce8dae06d39ad682cb8c03ce436857521084bbf7e729c1b5b","index":72731},"timestamp":1661427332,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e6e616d657375627465737431)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167542,"write_count":2,"write_length":169},"fee":6000,"kind":{"data":{"args":["0x627463","0x646f6d61696e6e616d657375627465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000f465dc179e93cf89048480bef835311ab72cad50000000000000009000000000000177000000bb48a55710355278865f650ff366b338edf11e6cb27fb230cef3a5c2744219832c2dd649eff7104a4ce992a54d38552b808f95501e22148281d0d04670010bf010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000012646f6d61696e6e616d657375627465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000057604686173680200000000086d657461646174610c00000004046e616d650200000012646f6d61696e6e616d657375627465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0f465dc179e93cf89048480bef835311ab72cad5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST7MCQE1F7MKSY4G9140QVW3AC8TPWPATP7K7TNP","success":true},"operations":[],"transaction_identifier":{"hash":"0xa0802309a619e8692ed0a2c04ab4ebad866786daa23ad459aac21d7b8f8139a8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdee120cc7f3218d3c255a26978343d52b9c519ed3de140db426b5435dfda2174","index":72899},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001687238e8dbb9f24d424cde17b3d5153e129356cfa05f157f7","index":2344089},"confirm_microblock_identifier":{"hash":"0xbeec30b07c52e4534d8eaa17442b3fc8f0e56f3349878ec374481e31e3692164","index":3},"pox_cycle_index":327,"pox_cycle_length":1050,"pox_cycle_position":738,"stacks_block_hash":"0xcc7430a69ef2852bd0091c6e378e8831a96aecd9e4d97d64b23f029f9ca7cc7f"},"parent_block_identifier":{"hash":"0xafbc2e2af5e017695690cc5a35f33404d904593b2097a30bf481ef989c5be273","index":72898},"timestamp":1661516011,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696e6372656d656e747465737432)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":12000,"kind":{"data":{"args":["0x627463","0x696e6372656d656e747465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a800000000000000130000000000002ee00001c8bef99f7a1b41bf04893e93f62373697d6ccaae9626acc3127be55b70addab57f25dd3df47e29af3d97f7749bae1d2ea5acfa5f6db3663ba772b3fbaa77fd66010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e696e6372656d656e747465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000057b04686173680200000000086d657461646174610c00000004046e616d65020000000e696e6372656d656e747465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x5f204227dc26f8acdc41df9f936f15ac0a8b1902596b5b8671c482a44b90f8f5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5bdf4374433ccb2ce7b89517bdde8e9fa57a52f7a1e291f245bbef14e7b0d94b","index":74052},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002530fd90f5f6dc1534c1c5798aa34278c1655de9b1025e509c","index":2345574},"confirm_microblock_identifier":{"hash":"0x601ea2e27b1238b30ecbb1a7f9965c10b4b36a97298bd63e6b88c1654c16e5bf","index":0},"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":123,"stacks_block_hash":"0x0447beb9f8f6f1f2013e138134867c10ac5db48a84d85a2fa659132a527d2d45"},"parent_block_identifier":{"hash":"0xccd4f6784dfe8c18ec72beccc683498e3facce59a25a72f5e4dbcecdc788eb46","index":74051},"timestamp":1662448577,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7374782d6f7665726861756c)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x7374782d6f7665726861756c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004001c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e2200000000000000020000000000000bb80000e1563ffb02c8c5c96cfb74e6c111efc7aad00f6218e964390118ad89d0f090ee6754e99b3365ff5f09206e7c5819c904800eece25ad18e9d93b5960cf0e903cc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c7374782d6f7665726861756c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000057c04686173680200000000086d657461646174610c00000004046e616d65020000000c7374782d6f7665726861756c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STE8SS2JQEYA3G9EA2NJSBWAV7JEGKHY49Q586QX","success":true},"operations":[],"transaction_identifier":{"hash":"0x7da8413edf1f0f4e93e88980c3b917781c5a3b7978ec9607ad8aee3aae6a9812"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x601a8c63bee9fe3e4503bd759005c608631dd411dadf6cb53846e0a0956a7e37","index":74371},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000091f56ee9e1bc09f2a81b1f07920e070a31d2385815e010eada9f1ce0","index":2345928},"confirm_microblock_identifier":{"hash":"0xeaa4a09aee3ca6ca0ae908631e198e905a835c258c616ebae370f332c054f87d","index":3},"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":477,"stacks_block_hash":"0x97aae7d920899218b202d344a994e062daa13a3fe5aa64e1976e8d741d65baba"},"parent_block_identifier":{"hash":"0x9787f1accfee0aed6950f8e253d7e00afcf5928e4037a27b3b26c3fb85138a8c","index":74370},"timestamp":1662718537,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265666163746f727465737433)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265666163746f727465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004001c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e22000000000000000b0000000000000bb80000b4191a5ef9fdccd4f648164e575535b86b0262cb1f77da8d9261b51775b764801089f49e9aa3495cdcf75f6967aa795426826ce7c1a3a3143bb77c5500b0bea9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7265666163746f727465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058404686173680200000000086d657461646174610c00000004046e616d65020000000d7265666163746f727465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STE8SS2JQEYA3G9EA2NJSBWAV7JEGKHY49Q586QX","success":true},"operations":[],"transaction_identifier":{"hash":"0xbb198f3ce754006a2b02cbbc5059ddef523b81900557e4a06d6a841a925ea64b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9fdf90689d1e2fad1fd67ebdec05920ce7a6c40aead1c475d95c921a9d916c80","index":74376},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000078df535b9456b123e836c9c6ed42beab0c0fda88fb8a9c9f940de007","index":2345935},"confirm_microblock_identifier":{"hash":"0xd477d02c7be5f3ac5ff1f06163f47485099c369b70f3fd4152df0ca159fe6b77","index":2},"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":484,"stacks_block_hash":"0x5215a71684369b5e539192740d5176c32acdf40df2a204e2a1cad8cb416fbbf5"},"parent_block_identifier":{"hash":"0x476e83156e006a0744ad94a1b30cc84fd51ededa5e805b231d35d3456966b4c5","index":74375},"timestamp":1662725244,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265666163746f727465737434)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265666163746f727465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400744c17dbe498e8cdd77b89d4b243c83485c41d7600000000000000020000000000000bb800012f0780fa2b5c2480ccd2821ca73e7513289e82d0cfbc59266a714f4c63f30b6d341bda4d06186f2caaf8330acf1ab8749014bfb27e5bd6f550ad0ac686896163010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7265666163746f727465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058604686173680200000000086d657461646174610c00000004046e616d65020000000d7265666163746f727465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a744c17dbe498e8cdd77b89d4b243c83485c41d76","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1T4R5YVWJCEHKEQFE4X9CJ3S0T8BH0XERBAT5PN","success":true},"operations":[],"transaction_identifier":{"hash":"0xa3f85786b5c1582151036567bf21e21522fc3a0aa878d437dec90b5b5e64a358"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4cc3536c42d9b28ddb11f4958b58918e8038da88bedfe71788f292102569b505","index":74377},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000003c826c5c22187ba3898bebee61253b2633ab329da2e2caf0f0b1","index":2345936},"confirm_microblock_identifier":null,"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":485,"stacks_block_hash":"0x04c541bcd759bf9290bfead57b1781fd0434c0c1b97c2230e5c04cc2d2520cc4"},"parent_block_identifier":{"hash":"0x9fdf90689d1e2fad1fd67ebdec05920ce7a6c40aead1c475d95c921a9d916c80","index":74376},"timestamp":1662727651,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74656d702d7072656f726465722d74657374)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167542,"write_count":2,"write_length":169},"fee":3000,"kind":{"data":{"args":["0x627463","0x74656d702d7072656f726465722d74657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040058965255434f9d7d32741070b80ec33e724c126c00000000000000000000000000000bb800014a09f2d7199ba15e4b0910d6421ed145e8d3b173c46845b0dae095c578605b594bcfe0e7344d6bd85314add8acede0bd057b27bcc43741c17f53c1ca95e908b7010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001274656d702d7072656f726465722d74657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058704686173680200000000086d657461646174610c00000004046e616d65020000001274656d702d7072656f726465722d74657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a58965255434f9d7d32741070b80ec33e724c126c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1C9CMJN8D7STZ9JEG871E0ERCZ74K0JDJQW2AQG","success":true},"operations":[],"transaction_identifier":{"hash":"0x117ba98bdb3f08e24a82eba81bdb4665738f943d95fa45656fd57be426209668"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737474656d7032)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x7465737474656d7032"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400724614b6e9ee4a4049da6cb1085bed1aeef7b71300000000000000000000000000000bb80001021494ea75d63a47dc388e525c2c96b4bbad4d22e43b9c72757d7fd119372e1245e3824e4287fe4b471e60453c02658e27662c712cc21521db14763998a1b13e010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097465737474656d7032","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058804686173680200000000086d657461646174610c00000004046e616d6502000000097465737474656d7032096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a724614b6e9ee4a4049da6cb1085bed1aeef7b713","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1S4C55PX7Q4MG29V9PB222VXMDEXXXQ2F0RQYBD","success":true},"operations":[],"transaction_identifier":{"hash":"0xc9b7ecec33becedf4cf97c28d41a77988d70bbbf83ebf6fd7afd67b30831d83f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2ead98d5b372fce10fb888c7398b7708c5faaec09904035c3bfcb3445b3b0951","index":74379},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000013429d1d8ea910404168ef410ce6904e40f1fb051c3908058d","index":2345939},"confirm_microblock_identifier":{"hash":"0xf6785c308298210490b0f69699fc8370495ed9517ec13ff769687af537f8842c","index":0},"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":488,"stacks_block_hash":"0xb789d40ac8afeba79df06bf1ea1f9703ed8c3aa8d05001a4518a1b66f17fdb8f"},"parent_block_identifier":{"hash":"0xcdfc43d1cc74bfb54799a6c22115a8a1e362c6d9dd18cf2f54b7b5d9bf4707b5","index":74378},"timestamp":1662730054,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265666163746f727465737435)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265666163746f727465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004001c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e2200000000000000100000000000000bb800011c6786176e038510ab1be52a97ae45fe437e419e87ee2c9743a038c846e8ab8c683da39342c751792cbfb2c48fd0327b4c072d932915a6549e98d251ae1082cf010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7265666163746f727465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058a04686173680200000000086d657461646174610c00000004046e616d65020000000d7265666163746f727465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STE8SS2JQEYA3G9EA2NJSBWAV7JEGKHY49Q586QX","success":true},"operations":[],"transaction_identifier":{"hash":"0x6eea9635545d323f89c3727b3d6f40a706e17965746d8b517a85fcc2d948ea91"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb45515b6865b2e192da5e215e47f595bc951f521a1a70afc8078512490f7d0d1","index":74733},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001410268a0929ac8402c3b9fd9f750e307f54af2e5b0c57d0b4","index":2346403},"confirm_microblock_identifier":{"hash":"0x1bdaf493fbc2e8903363e0d06c9391ab82b0a922a13b2e5f77a47a8bcf21ad0f","index":0},"pox_cycle_index":329,"pox_cycle_length":1050,"pox_cycle_position":952,"stacks_block_hash":"0xc6c4f10bb4d610d9a1893f00b2c5f083a24e2fa045a23f169fb16d541f4a63ee"},"parent_block_identifier":{"hash":"0xa347fb4378248fea3760717b96fec3e3e6b0fe9e92279b44a709f155deafa923","index":74732},"timestamp":1663072148,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737434)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004001c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e2200000000000000130000000000000bb800006da17ec9574bbd8a2251e3d3c7991aaf97073f46d2d276b4ed56665e0bfd29a15e614c5051de03e784691424a64effccd23b3f3a3f67571e9413f67206f65805010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000058d04686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1c8ce452bbbca1c12e50ab2caf8ad9e4e84e3e22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STE8SS2JQEYA3G9EA2NJSBWAV7JEGKHY49Q586QX","success":true},"operations":[],"transaction_identifier":{"hash":"0x30f9c6ee2631ac05065d82c10ae2aaac98e66dbfa872393c2d03e04189078292"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x697dbd801802217141397384971f573d63d8c5ef9dacee2971e58f62fe295a66","index":74976},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000355e14bc1a1000db0110ef82bd10e447b4f1a1127f20c3133f","index":2346670},"confirm_microblock_identifier":{"hash":"0x3580c72e2ef92a997cce4d075f69c9fe49616d8f87309387be95d60025754ba2","index":1},"pox_cycle_index":330,"pox_cycle_length":1050,"pox_cycle_position":169,"stacks_block_hash":"0xc95fe082a894a5ec01642a4863e9332b5e5bb367ff2c5ecbb7501b4d21138aea"},"parent_block_identifier":{"hash":"0xf9a3af7814cdc3ea878abc28bae9367e7dfc268179983744616adb84115ae98f","index":74975},"timestamp":1663314097,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737435)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":144800,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040058965255434f9d7d32741070b80ec33e724c126c000000000000000600000000000235a000009af8185121bf730c8a6355d5ff8427977afab4d9f4e91e21192be2c65f844dfa12e0bb56e41e471b17a2aca76dde696f555223c60bb3a81809e1b12813665950010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000059204686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a58965255434f9d7d32741070b80ec33e724c126c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1C9CMJN8D7STZ9JEG871E0ERCZ74K0JDJQW2AQG","success":true},"operations":[],"transaction_identifier":{"hash":"0xc594c5d50b0f1dbb948196b356d509fc514d8bf12e625afbeda4a7f1057e67a4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe47dd6c3f220967a3bafa618752af9340ac55eb5ebe31a163ac6f7890d322cfa","index":74999},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000b31af8d77977ae5a3357f5253024b07aa322bbe2926f23916","index":2346694},"confirm_microblock_identifier":null,"pox_cycle_index":330,"pox_cycle_length":1050,"pox_cycle_position":193,"stacks_block_hash":"0x13a69a923def648d7ed7fecd4f2171b9a63b40a17af2a8d72076899fdc9f2a00"},"parent_block_identifier":{"hash":"0x451645415940efd972dd94e3d17824811a2a25a664dcaf6f1a3957dc8e128031","index":74998},"timestamp":1663331160,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72656c6f61647465737437)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":12000,"kind":{"data":{"args":["0x627463","0x72656c6f61647465737437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040058965255434f9d7d32741070b80ec33e724c126c000000000000000a0000000000002ee000005389346c91413468b7eb7bcf66833188c8e1db40bf6d66367437fa4405e2735a1a6f9880f9ee73a3b5314941382890c6a56e40804a0abdc75dfeb84ee7d3e954010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72656c6f61647465737437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000059504686173680200000000086d657461646174610c00000004046e616d65020000000b72656c6f61647465737437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a58965255434f9d7d32741070b80ec33e724c126c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1C9CMJN8D7STZ9JEG871E0ERCZ74K0JDJQW2AQG","success":true},"operations":[],"transaction_identifier":{"hash":"0x131f7a042c2dd2660fb27320da14c3f1025a7440b937e34af06ba95f8b62176d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1f16edce79fd8e28c1b1440c1d7e8636daed9f2171ab589906aa9fcc05cd75ad","index":80416},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000359b746029b89b28b4a6cfb71f71256824a04384281149f0a","index":2377100},"confirm_microblock_identifier":{"hash":"0x07b3dcd2eeb45bd052c0fe972a06023fd622c6507b5370363003158794539da0","index":0},"pox_cycle_index":359,"pox_cycle_length":1050,"pox_cycle_position":149,"stacks_block_hash":"0x9d73d532dcff96eb2fd66bc0d6c44106a2d69158eaf6a938cfdb37f22943e047"},"parent_block_identifier":{"hash":"0xbbc74f7273b48a2b4f7b313cd8fb77491968aae5832b9bd02bcc4c018d25a316","index":80415},"timestamp":1666073950,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737474657374)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":71200,"kind":{"data":{"args":["0x627463","0x7465737474657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a8000000000000001700000000000116200001b6f207f96b1853eaaa3640c46c56d1016d611355cba8d49c088a0e4df14859e0639e47a1fa22d899b5a0a460bc1b471004f73e55d60c9ce8b4f2af429f566fd1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087465737474657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000005ad04686173680200000000086d657461646174610c00000004046e616d6502000000087465737474657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x372c1242c5336a35c4ec1bf3717f651d64c34011e498fb538188753018c35e71"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x22aedbeef4a47aa3bc4fcd95329435b92ebf63a23389142426ef4a8e3a5405be","index":81147},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001ea02a2c0ae90fa23d7c280685b6527754ccf9ced1edb34c59","index":2377959},"confirm_microblock_identifier":{"hash":"0xc89290a1043893cb42d22fde2f82c92071f08343ae485d85a36ab616a68a08ac","index":5},"pox_cycle_index":359,"pox_cycle_length":1050,"pox_cycle_position":1008,"stacks_block_hash":"0x2fc3ebd18ecafdf056c7a69d02e8d22ae06c5d23fb461b53c08a4e82f25ce0a3"},"parent_block_identifier":{"hash":"0xefdc6f5fd5066a6f8c33dd29d730d862012275dc2b52e4502380218ed65ce0e9","index":81146},"timestamp":1666596382,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x747279616761696e74657374)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3500,"kind":{"data":{"args":["0x627463","0x747279616761696e74657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":34,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a800000000000000220000000000000dac0000126ba7de34f8a9d2e05875790297cf16cb658b38fe993cc94fe7795f10bc18687229758215ecf1386cb38f095d0b2c6e9057a5057e4cc5a1542e3edd06d66c6f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c747279616761696e74657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000005c404686173680200000000086d657461646174610c00000004046e616d65020000000c747279616761696e74657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x0618614435ca71202e9d8d8cb7d6b60141c9d648a66d9e2964cfc539e82425c0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6d094e7d9ef699171a1ab6d0f5643cb613c46034a95416b2027028659bc3c290","index":83075},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000073537c842c7ef0154bda154defe6b97c356c280f8073dd3a6","index":2403954},"confirm_microblock_identifier":{"hash":"0x3360b5bde4387ede98d4510ba562d2161db6c7d6e0f658202754a35fa9c3b592","index":4},"pox_cycle_index":384,"pox_cycle_length":1050,"pox_cycle_position":753,"stacks_block_hash":"0x7774f00148c07b9df4c6b7126390431400686cb8418ac2b86ce712efaa369594"},"parent_block_identifier":{"hash":"0x30df5edd11e73c257ed52d7a9971e39f39afd581d8e5984a703b726f26ac3821","index":83074},"timestamp":1667547752,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656d6f5f646f6d61696e)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x64656d6f5f646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040012b54110318003cd57830756ce6864d3064afcd100000000000000090000000000000bb80001ca257fca73b08a5c8cd6ea469cd4947e1708344a44447f74b6a184a90e87b5004fcc4c261d1acc4f12474c57b1bca6f7bf866252e0d674f1a4ff1b780b8da326030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b64656d6f5f646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000005f704686173680200000000086d657461646174610c00000004046e616d65020000000b64656d6f5f646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a12b54110318003cd57830756ce6864d3064afcd1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST9BAG8G66007KAQGC3NDKK8CK9GCJQWT4KM4ASN","success":true},"operations":[],"transaction_identifier":{"hash":"0x0396c64ca37e26ecb252c572087d7588ef925baab238c0b3f1706e81dfa3f21d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x950d497ec6fed5e35f418d329a3bcab99893bb3cb77a402164cf18eb48bc6de9","index":83943},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000b21d4aaad1a1e57e4fc3c3ca037b20872a19a8c6da4267ef60b51ba4","index":2405106},"confirm_microblock_identifier":{"hash":"0x8ba3103bca10e8a36feb535e2d9afcc08de5305533b5fd128c81d7ff753b40d3","index":3},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":855,"stacks_block_hash":"0x93cce4816ae32860386a615ba2b3ed6a53029fee8e4a8b4ecf2643859d6f99bc"},"parent_block_identifier":{"hash":"0xcd4159df1d0c1aaf0d2129d533dba2720ed6f9e2ea79fb33c81d0b3fb3c88515","index":83942},"timestamp":1667775701,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73637265616d)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x73637265616d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040005391f5d843a0c6b04fa89aa29b0ab833de5868500000000000000020000000000000bb80000988f1081808078a76e7cec36c4113df9a1969fb0d9e4d5b205ddf6e5f212d6e14dce714aec6f2b076aca4a7def7986a052a52a20961a49fb9ae0abbaf5328cda030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000673637265616d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000060004686173680200000000086d657461646174610c00000004046e616d65020000000673637265616d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a05391f5d843a0c6b04fa89aa29b0ab833de58685","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2KJ7TXGGX0RTR4ZA4TMADGNE1KVSC6GQZ05QTX","success":true},"operations":[],"transaction_identifier":{"hash":"0xec9e25d98284ef799c3a9d4a77b3f670ee2d8bdf048255aeab7153e799a15216"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xba13c0a924e4b93905830fd855080cf86e5faf53ceb22b5143f6e8abf62ac4ca","index":83947},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000005734000a1922897120a76a168faa8f9a8c4e05d25592c7786edd","index":2405112},"confirm_microblock_identifier":{"hash":"0x53e74ced68a17b7178c4ca7a55be2efa80c7368b0a455a209e50ee25b10e69ba","index":4},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":861,"stacks_block_hash":"0x3a291452486616d21a9c7a8c678014a24f11b4e2131d9edf4d5051a13efbf7ef"},"parent_block_identifier":{"hash":"0x85309dca3b33402147f2af9e883bae142107f65d6952e3c71972230ac78d6ae4","index":83946},"timestamp":1667778039,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6672616d6565)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6672616d6565"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ce20107969127908f07c1f8e09e8e9a1f14681cc00000000000000020000000000000bb800011e63dc0e6a76de7a5090294c9f36094980ba949253ce36c48ea47f6a246a018405a11194445e4db0ffae08fad0c0a7d4b413137a82f9bb92144f1a50ef7d8922030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066672616d6565","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000060304686173680200000000086d657461646174610c00000004046e616d6502000000066672616d6565096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ace20107969127908f07c1f8e09e8e9a1f14681cc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST372043SD497J27GFGFRW2F8X6GZ2HM1SJ2T5AZX","success":true},"operations":[],"transaction_identifier":{"hash":"0xf4ffc352ac63b2dd6fc1ffa04aaa7651307cf8bba67cbb93be628a21f3410dd9"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6672616d6565)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6672616d6565"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400ce20107969127908f07c1f8e09e8e9a1f14681cc00000000000000030000000000000bb80001fbfa5e017b3f85df5de504a087caffa3ea1aea45e0760ae51dfa8c896de1382c2f66e1c6582ce1c17188783d9ccccd3c766f7781743b40c8eaa3b1cef9e12f4e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066672616d6565","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST372043SD497J27GFGFRW2F8X6GZ2HM1SJ2T5AZX","success":false},"operations":[],"transaction_identifier":{"hash":"0x1cefba7d6304f7026d82d51fc9a94c25077679e0d5fceacbca29c2d99af0c51e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x79cc79bd832a7af02ffb203d89469585167424e7730c9dd592834551cb602ac5","index":84008},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000f23efa494c8be5f2b84706011c11cc3d9de213c34f87135256c3","index":2405183},"confirm_microblock_identifier":{"hash":"0x43942e158b11caf052014b27524ac4f5246317f82babdfcba8e1e398de963d4d","index":3},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":932,"stacks_block_hash":"0x34cf13f6340ca28759260d61e0a78ab84806d056d4d1548f891caf2c148378f2"},"parent_block_identifier":{"hash":"0xda7f9e76c9994f7016972419a2b231d5fd5f37d0e4044114a6f35447d7bf8871","index":84007},"timestamp":1667817032,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73686572696666)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":30000,"kind":{"data":{"args":["0x627463","0x73686572696666"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ce20107969127908f07c1f8e09e8e9a1f14681cc00000000000000060000000000007530000005e4d9af05de0b9c38b0d853c198dcd26bd5b080a133bbf89521e86940d789de585750f5938e4d6d764883e3755f29b87deccc0f3d299b56a28625d0d9128f55010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773686572696666","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000060804686173680200000000086d657461646174610c00000004046e616d65020000000773686572696666096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ace20107969127908f07c1f8e09e8e9a1f14681cc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST372043SD497J27GFGFRW2F8X6GZ2HM1SJ2T5AZX","success":true},"operations":[],"transaction_identifier":{"hash":"0x24d70fbc3c9c9f53b19512f4fa706b0cb8388d4a244059d5f5a77a1a7e5d9d97"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xed2a9ee4927136d5b211203ae859cb02a01a16dac69b3cc51a8bc7e33c1d3f88","index":84021},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000039edad266518c25ff7186420952e956c05f5a78ac8ff2699d","index":2405196},"confirm_microblock_identifier":{"hash":"0xb871cd5116203070ffa485bcc990f402dcfd2eb50baf0da0814ddabadb583ff0","index":4},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":945,"stacks_block_hash":"0xe5ab102b8f4c759e8943f1898e7d1eace18132aad4d6ed35ccf864fe5f8d5687"},"parent_block_identifier":{"hash":"0x91d796be338402ef47559674493a7cf3635cacfb9b6f80893b72073ceb214491","index":84020},"timestamp":1667825783,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626c69747a)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":15000,"kind":{"data":{"args":["0x627463","0x626c69747a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ccf133d2c282011b2866b6d71b6087d79385f55b00000000000000020000000000003a9800019819de25524d76ba981d4edb02071d0500e6818bef21a8824e31b564d585ad1f7dc8b7f57c20e76da2b0e466d3152e12f7001063cb0afe2a27f73b1791d3ce02010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005626c69747a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000060c04686173680200000000086d657461646174610c00000004046e616d650200000005626c69747a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051accf133d2c282011b2866b6d71b6087d79385f55b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST36F2CYJRA1026S8CTVDE6V0GZBS71FNBD196NK8","success":true},"operations":[],"transaction_identifier":{"hash":"0x7c8a19425cb1c0cb519f22d69cc94e09ceaeeeef0709770ff7cf73aba93bb5e7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa2972ed2d39060bcfa111cdaf35e6e14aa5bd0ad1c78415ab48ffc5e3c1ba70c","index":84027},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000aa567e3e213571b0f29f975448affdb00d49e7512b4caf062","index":2405203},"confirm_microblock_identifier":{"hash":"0x8827022e2706fde13910ff6293bedf8a2c3bfac5c68321a57c3b3711a0bb2c22","index":0},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":952,"stacks_block_hash":"0x61977f57e461cce0823cd81607a90752b5ecd6c8b1bdcb83c2d9c396338e46f5"},"parent_block_identifier":{"hash":"0xefd03849c637a908507a49d6ac6a92c8bc0ce3e801867a74894c908d051e2fbd","index":84026},"timestamp":1667830853,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e65776e616d65)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e65776e616d65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400eabeadb9fd7309492cff225e01194b79b80ea39f00000000000000020000000000000bb800017079000170e172c133a8b842428660d58b37d2543ed2f5ce75b1e4a8358627bf35d9c2c5617ded0c870c3f5bac2b0be96b981e37fa1dd6e9948e56062d0b152b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e65776e616d65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000060e04686173680200000000086d657461646174610c00000004046e616d6502000000076e65776e616d65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aeabeadb9fd7309492cff225e01194b79b80ea39f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3NBXBDSZNSGJJ9CZWH5W08S9DWVG3N3KYDK21AV","success":true},"operations":[],"transaction_identifier":{"hash":"0x83680e3a0cb7fcc1a840ca78271f0896faaabab54cfb764f68e0c11911ee7603"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x587483575a14f5bcd8b0f3f9dea0e734176dda1aa550578b83cea802749b6b64","index":84114},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000044c75a5764c6164a5c93a9a81906d258b4d7d87dc7c0a06239","index":2405298},"confirm_microblock_identifier":{"hash":"0xc10d2151008b72e7f33025026de7b91b8b6da10dcd0e469f7f177a62e0360058","index":1},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":1047,"stacks_block_hash":"0x25748ad35818170123951e6f8c7b4c700f5c8e6f91dd4dc47f8dfe047b0ae8bc"},"parent_block_identifier":{"hash":"0x92244541fb0da650b68edb155250da9feaec994e59cc752f28588174f50ccf89","index":84113},"timestamp":1667883117,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77686973746c65)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":6000,"kind":{"data":{"args":["0x627463","0x77686973746c65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040010ddbae093922a79f9d33c36c68875d2c1c906e4000000000000000200000000000017700000a342a3f9b2a92419b6f5be8652aea6ab234e37bb41874e4fa323015880efe4ed45f14fdf85e3794318cbedb18b725371d5dab9a7fb543ec367a96387045b5caf010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777686973746c65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061004686173680200000000086d657461646174610c00000004046e616d65020000000777686973746c65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a10ddbae093922a79f9d33c36c68875d2c1c906e4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST8DVEQ0JE92MYFSTCY3DHM8EQ9C3J86WGQBEECY","success":true},"operations":[],"transaction_identifier":{"hash":"0x1c09441abe045b0fc4cff32b74bb03bfe703add133e6f50b391af2a4419fd70d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3cbf90a3699556abc1c4acb338b0e2f546c0ee96a5f6e2beb0f58be23fdca5f5","index":84115},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000427e4eb88ee0a20a832082f9cf0138bdbfb46c1ef45b246940","index":2405299},"confirm_microblock_identifier":null,"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":1048,"stacks_block_hash":"0xd1c0020695ba9426e7f1adafd2051aeca9ea5397e49e86681d5978c654249bfa"},"parent_block_identifier":{"hash":"0x587483575a14f5bcd8b0f3f9dea0e734176dda1aa550578b83cea802749b6b64","index":84114},"timestamp":1667884238,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77686973746c65)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":192000,"kind":{"data":{"args":["0x627463","0x77686973746c65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040010ddbae093922a79f9d33c36c68875d2c1c906e40000000000000003000000000002ee0000015a1946e49b77de6ff4c7abe7dcdc1c970a77b68fc982f1ec954011c7750eeb781de8334d433b41b51b38550bbd083cf853c15d8f35bbeb5ca54ccda74c4999a4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777686973746c65","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST8DVEQ0JE92MYFSTCY3DHM8EQ9C3J86WGQBEECY","success":false},"operations":[],"transaction_identifier":{"hash":"0x09291be2c1d777c6d2bc060a3c5a0623210fa5a381ec62edd3367ec8e15e192c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb33e6fac0ace2b21bbd3053773c8528f18eb968d81dc6c9ec8b1b30ecc002aec","index":84116},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002856f1b1c5492537d93b5acfa85738236215af4383f5ccb9e9","index":2405300},"confirm_microblock_identifier":{"hash":"0xc75c59930cd98ace0f9f5369c60468df94adf436f7b02c9b669bf8f7f444e54a","index":4},"pox_cycle_index":385,"pox_cycle_length":1050,"pox_cycle_position":1049,"stacks_block_hash":"0x6e3072d4247eb79377a9197550a3fa65ab6d7e4c99954fb49169fe1fc94175bc"},"parent_block_identifier":{"hash":"0x3cbf90a3699556abc1c4acb338b0e2f546c0ee96a5f6e2beb0f58be23fdca5f5","index":84115},"timestamp":1667884411,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c616c)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":24000,"kind":{"data":{"args":["0x627463","0x62696c616c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e2300000000000000020000000000005dc0000184842b01c273a3ee49ad7ae9458e8688e2e4276ae79a265ca1b99e1d9b0815504ecfbb3763cb933843a7ec30e1316eb2f61f9336271317c276f90aab0042a48f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000562696c616c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061104686173680200000000086d657461646174610c00000004046e616d65020000000562696c616c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac30d9ea5321592df016f6a3fa91f07c6927d1e23","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":true},"operations":[],"transaction_identifier":{"hash":"0x12d9db77ad3735dd2a7a60c0d6fbad2f7403bbc3f309ce0690bc2dbabdea433b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb17bba20ebe51da1bc7a9523279fa1845f106650909c9d68b6869958b290d461","index":84118},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000eeb8ca236b1d751f5930ff86bf4050d5a237453420782c641cee","index":2405302},"confirm_microblock_identifier":{"hash":"0xace65f6115a6ec9718110560240545e1fd9356fe82c99bb53102f74d0351a17b","index":5},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":1,"stacks_block_hash":"0x17c6dfd49a76734dd331a2d4a85926b1a79ba9c7e4b385acae96467f57256b8e"},"parent_block_identifier":{"hash":"0x62603298ab1f784359f5d97d40ed699da2ccd9378b7184c4199fb25d047bdc4d","index":84117},"timestamp":1667886344,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x726561706572)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":24000,"kind":{"data":{"args":["0x627463","0x726561706572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000020000000000005dc000001d1c11f99ed82e388fe79bf57465558bc192ff79e21d01951cff2039bb8f73842889236ac81f0993abe99a35613bf4ef92614390e393db736da25ee9c097f071010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006726561706572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061204686173680200000000086d657461646174610c00000004046e616d650200000006726561706572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0xe8304372677d8e168f4b051c9e839301ec250a9ef648458b886ec12e1ea23ae2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8d6fe47c36057cd884ed34aa9394e42aa95de635b5b75b251d54a350ef8c4cac","index":84119},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000038ef8414692cedc60a67b3281a5435911ac8b11ec4098d63e3","index":2405303},"confirm_microblock_identifier":{"hash":"0xf701582cffc57c0faf638640a293b527a6908e463fa4714ae3d55ed7ca7622ed","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":2,"stacks_block_hash":"0x7e3c74516990bd6bf8b6cf7111641578dcb73163bcca4363b0195e8ae85fdfe8"},"parent_block_identifier":{"hash":"0xb17bba20ebe51da1bc7a9523279fa1845f106650909c9d68b6869958b290d461","index":84118},"timestamp":1667887557,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x726561706572)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":96000,"kind":{"data":{"args":["0x627463","0x726561706572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a0000000000000003000000000001770000017d8b2c1350957911c76f97d9188095cf2af1466d92ecd6c222714c9ff429f31e2e4c6ae5e3d98205c988223fc812a6a619446d569191e23022f1e9f74a88fd0f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006726561706572","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":false},"operations":[],"transaction_identifier":{"hash":"0x9a52907e8cc07160c9d19da2af61f984321675710db45158814d8c8a2fe08b10"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6f7374616c676961)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":6000,"kind":{"data":{"args":["0x627463","0x6e6f7374616c676961"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b00000000000000020000000000001770000103ce5a745c38f94fbc95b81652361e6f8f7f923a1a5f8bb8dea97f3781a182eb3b8a5a268f95b12f16a4debe8ac6d8c8046b4b1ddf4e50dae3500e329bb2c267010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096e6f7374616c676961","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061304686173680200000000086d657461646174610c00000004046e616d6502000000096e6f7374616c676961096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x102481960bb79ce68ce8a8e39a4bf6196873f59ef10ed81d27cf5bdbae229bee"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb04f7028da96080cd234c8661c3ab7fbab741e2623f0d1bb729f600dce2d145b","index":84120},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000430f0a32eb1d1e96e443c0899909c7203faacefbadf4e2185a","index":2405304},"confirm_microblock_identifier":{"hash":"0x9ef55a6e833d87b25f73a93728f3afd3cc4e226812b88c0b814de0781672ecdd","index":0},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":3,"stacks_block_hash":"0x440b9a009f225af92d4e1585f9f38b4ed160fee8861841e036550010ee281dc8"},"parent_block_identifier":{"hash":"0x8d6fe47c36057cd884ed34aa9394e42aa95de635b5b75b251d54a350ef8c4cac","index":84119},"timestamp":1667887974,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616368696c6c6573)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":6000,"kind":{"data":{"args":["0x627463","0x616368696c6c6573"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008298c07ad273097619a191785dcafc2cf09d5305000000000000000200000000000017700001e5c3966851182b6ee0b1c7276324f57d3049f30f94fbf4ecdf8f786c980f2342677762d2645a31dedece405eba2249b607db829c020ae123183604b7fabc7fca010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008616368696c6c6573","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061404686173680200000000086d657461646174610c00000004046e616d650200000008616368696c6c6573096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8298c07ad273097619a191785dcafc2cf09d5305","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST219HG3TT9SGJXGSM68QGQEAZGPF17AK0PWE6SD3","success":true},"operations":[],"transaction_identifier":{"hash":"0xd00a740881d3bc7be4b901267cc93c2b043f4106fcb33e8ae1913265fafd58e9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1d9d7b2871dc26d4661e6512ff750c8424fd69e6d58742b506f378e795646148","index":84121},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000010db15d1f8df6fac4b529a5b2fda176ac89274a324819844c7","index":2405305},"confirm_microblock_identifier":{"hash":"0x6e5c43ba1411f6b62f79c5094e9464a7429865f896a3111e459cdd12b5ec974b","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":4,"stacks_block_hash":"0x500a59258b454cc8bbb62282fa2f7dd55acaa038cfcba13030b5eaa0262a7b8a"},"parent_block_identifier":{"hash":"0xb04f7028da96080cd234c8661c3ab7fbab741e2623f0d1bb729f600dce2d145b","index":84120},"timestamp":1667888285,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73757065726e6f7661)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":30000,"kind":{"data":{"args":["0x627463","0x73757065726e6f7661"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c80f061403e91afa78165a08819dff011fc2f541000000000000000200000000000075300001d63ceeb8f63678fc7db5750ed63b2ca8c3bb1a8cffc4283225e472332a8eeaa06d7accf0550a10bf35f2037c5be3528f54f102553830a66a93ee14e7fe9cb4d6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000973757065726e6f7661","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061504686173680200000000086d657461646174610c00000004046e616d65020000000973757065726e6f7661096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac80f061403e91afa78165a08819dff011fc2f541","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST340Y1GM0FMHNYKR2SD0H0CXZW0HZGQN87JDTXCJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xb74ffcf4cce93a5507c4771c256f6b79e71a88a9656be24d8457080046abbae9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x73fb7fb17ef7dc2c97844193b9d8fb7763d90880bdccb49dd2935e9252be8a66","index":84122},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000057a616e558afbeb78f47931f3122cd86d911626c6b370c4b0","index":2405306},"confirm_microblock_identifier":{"hash":"0x7f8f57fff315e52c360e3da846a331aee1cb39e6703ebe31f4922e2a6cb4905a","index":0},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":5,"stacks_block_hash":"0x97020b4f5a4f7906709823dede1836eda2a86810483c39a26962034aebf364a8"},"parent_block_identifier":{"hash":"0x1d9d7b2871dc26d4661e6512ff750c8424fd69e6d58742b506f378e795646148","index":84121},"timestamp":1667889088,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f7a696c6c61)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":12000,"kind":{"data":{"args":["0x627463","0x676f7a696c6c61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007a4389649f07fd1bc0383216339055b5922005cb00000000000000020000000000002ee00000a2e648c8a35501040b024e5e6170e84076afdcb662b61360fa21295dde32ffe10ee8181f032f602925ec6d4e3b18a68172984bbdc00a6c2a1b0818dbe6b9b410010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007676f7a696c6c61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061604686173680200000000086d657461646174610c00000004046e616d650200000007676f7a696c6c61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7a4389649f07fd1bc0383216339055b5922005cb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1X472B4KW3ZT6Y070S1CCWGAPTS4805SCT6P4WG","success":true},"operations":[],"transaction_identifier":{"hash":"0xcd7b8a9bfac6dfd3f404b659c80c4021e59e71bbec31fb96a1701cc654000395"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x647261676f6e)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x647261676f6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400d63e29634052fefbbf4e3e2d915ffa3680994cd400000000000000020000000000000bb800013b3a95c4ee4cff316a0b6dbe078a94cb7d1c79666a0d015297b68f15f4a0dbd828268f10f9a01d982e2d7b0cb93eb7299256a8f8c32953dd7c87318ba8472408010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006647261676f6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061704686173680200000000086d657461646174610c00000004046e616d650200000006647261676f6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63e29634052fefbbf4e3e2d915ffa3680994cd4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3WAB3819FXYXZ9RZ2V4AZZ8V816ACTK7NVBKP","success":true},"operations":[],"transaction_identifier":{"hash":"0x72bbda12765de5e5add690985af4e351fae5651c87b5c93e5eac4a37282016aa"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb4e792923095b6b1526a61ffd124329a615a5b3c1866c0b5765f4936b1a923c4","index":84125},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000044772b67fc5d72a0d28fa42ee7c4f0fad27fdf358020beaefb","index":2405310},"confirm_microblock_identifier":{"hash":"0x4bc252d111cbc94fa38abc33cfb01471429dc449f231e47d58db8b27947396f9","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":9,"stacks_block_hash":"0x55af7877f54f90affb14ca523979e6a68c37f08f25cdddea7bdca8836f4f0f7c"},"parent_block_identifier":{"hash":"0xd34bad477071f54aeac0c72da1f9ef41a34d08e759a77d8b91282a0526938253","index":84124},"timestamp":1667890294,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6163626f6f6b)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":6000,"kind":{"data":{"args":["0x627463","0x6d6163626f6f6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef09659000000000000000200000000000017700001b98aca1cff127786d0185c16f15c9ce27ad71c9e9f7c8c118fb1535a24bdc8c437c4a38aaf3c9016144886812001563d41a204c868cb5098ed17decefb38765f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076d6163626f6f6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061804686173680200000000086d657461646174610c00000004046e616d6502000000076d6163626f6f6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a65a21f6c2fe4aede58afa9760e32988d5ef09659","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":true},"operations":[],"transaction_identifier":{"hash":"0x505427a8b24edcef03776695a08bfd93cfe142129a92a9a54c25f46123b07d13"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1a7be76ad8aa90d38a86504d24c8185dd1b5db3bae589ba86be860733543cc30","index":84127},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002f25dffd0bd8add21709d40f59976c9ed9635959da8edc25b2","index":2405312},"confirm_microblock_identifier":{"hash":"0xe687240e0fadad88f953c7b6db48db0b9e4b2a628632b857aa6a6eedb9dd2666","index":0},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":11,"stacks_block_hash":"0x9582bc904929ae60690273a34c5116cf56c6838209924b907d1b074f8bd6d290"},"parent_block_identifier":{"hash":"0xfca08ba5fc5d67bcfa18ccb8749fca0683669e01fd1fc007d21cc2122970765d","index":84126},"timestamp":1667890846,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6261626179616761)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6261626179616761"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004009665349744a4280711e6d4c8232ea804d91e8df600000000000000020000000000000bb8000044a339aa2618b7b36eaf6652a59ed7661a9df94b981b688d375261924d73dbcc4e3c4162d7621a9eb3225ebe36cf70d4f6794bff61dcbd4e7c61b82e5fe657fb010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086261626179616761","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061904686173680200000000086d657461646174610c00000004046e616d6502000000086261626179616761096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9665349744a4280711e6d4c8232ea804d91e8df6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2B6AD4Q8JJ2G1RHWVACG8SEN02DJ7MDYTMA9RBX","success":true},"operations":[],"transaction_identifier":{"hash":"0xd929f17c4d7d8e31381f8438a633f398ea9373c6f6f7093f893d094f484a3547"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa2a36f26cb213433be8d9aa76a62f3d0a649d04233adec949e2e6407fe8da119","index":84132},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000019e6ea1e04dc6f4f9a1a36d32359e49017d9bd57c02e8d55d2","index":2405317},"confirm_microblock_identifier":{"hash":"0x440ce63fc8f099a1bf0425ee0b48854e7e3377778fa285190e34e3d9991f140a","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":16,"stacks_block_hash":"0xfb76beceea4cdcf59631499accef64cf3ca632511fa1fc62e015a53c2e388750"},"parent_block_identifier":{"hash":"0x9e359f782b71be9f8c7a1e7007ad1dad9b7127bcbfcafcc29dc80e40874f566c","index":84131},"timestamp":1667894767,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f7273616972)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":30000,"kind":{"data":{"args":["0x627463","0x636f7273616972"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":132,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e160000000000000084000000000000753000013bd807958f52f435fd3ee80d35d998c42049b5d550e3d068828bd0a057785c474fa05b7f07236e52c933e849f226fecaa46b335ff58b990c78b83b500268e254010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007636f7273616972","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000061b04686173680200000000086d657461646174610c00000004046e616d650200000007636f7273616972096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0x2d0de485b048cbde3e6dafa63a2d0377d1b00e9dbea3b4078ca470c30aaea4e9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd13d8e5ce04a80c3dbaaa6b7ec7d236e2fa6e4392286df7431b49665b4796602","index":84139},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003a2e829baadb5656fe6295f209d03775b57f7880da7ef7bd3c","index":2405327},"confirm_microblock_identifier":{"hash":"0x9029bce8301f64a5632766ee6dd407de7e8c03b36f2725fad7e5bdc2f677f848","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":26,"stacks_block_hash":"0xee914da052bb4625fcba16430f8d14b76210dc3c32fa24a925cbdb0c111794ab"},"parent_block_identifier":{"hash":"0xde0c67d4c64d5f638d557c3baa510ffbc8e98cddcdec2feb0d6ce91fe09261f2","index":84138},"timestamp":1667900271,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6176656e67657273)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":75000,"kind":{"data":{"args":["0x627463","0x6176656e67657273"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004001124c966ba863ba7c8c86cf6c8b436ca411f602a000000000000000500000000000124f80001f1b4d4573d47e938d22284d44fb36a0fb7113f26f98a6f58bc47e5bf6b32cb922e9086880e7523cd2691947e373d0beeffb80735509ca4524cf4c3c5c2e7a444010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086176656e67657273","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062004686173680200000000086d657461646174610c00000004046e616d6502000000086176656e67657273096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1124c966ba863ba7c8c86cf6c8b436ca411f602a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST8J9JB6QA33Q9Y8S1PFDJ5M6V5427V05B80T6B2","success":true},"operations":[],"transaction_identifier":{"hash":"0x426780ed9adf053143f26e29a58cd3859187924e3c4da51b08c75d38b51e205d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xca0fdfe24a365d98bf6d631eb608336fed6c86dd20c8c46a215764f71efcea3d","index":84141},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000049f18eaba9b007e5bb7059cb1635a4ab4ed0697c5452754f9cf2fe8e","index":2405329},"confirm_microblock_identifier":{"hash":"0xf086735cc87277ab542d7c5f81f638ed68ffe0a910803df99aaf4a8de0ff5226","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":28,"stacks_block_hash":"0x4dd4a346fcc7dcfa52894177b9a09b4e93f20d1f0228303d412a5f31102adf0d"},"parent_block_identifier":{"hash":"0x997d2b59a92b567fe0907863c5ef8e6e94a64871245c974839eedd8029fe74b3","index":84140},"timestamp":1667901673,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e5f61)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e5f61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000060000000000000bb80001e389d7889ec2e284d1c7ff3676440cdadc7795278e51cf5c64391729974f7fe45181f4fbbbab82828766d46be9be46d55c272e3223f6dd288259b2fe0c06717b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008646f6d61696e5f61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062104686173680200000000086d657461646174610c00000004046e616d650200000008646f6d61696e5f61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0x3868dbcadbf4b2b89a80bbac1265ba444bfc999d7c41f1aa6f41ae786e358e0e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x814da5fdb43ad06322bada29203be8ac84a065620354ddb3229c0653878d4dd2","index":84142},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000ad88e272d6d46016340770c00801f51bcf1ee9698d5ddb65f074","index":2405330},"confirm_microblock_identifier":{"hash":"0x73f6a8a535c4226be2aca528a14737645712ad20e7c6cf6177677e75f70dcd18","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":29,"stacks_block_hash":"0xebca611529e6446bf2fed6d5b760d0765439ad99d119f1edbb600ec7d3447c88"},"parent_block_identifier":{"hash":"0xca0fdfe24a365d98bf6d631eb608336fed6c86dd20c8c46a215764f71efcea3d","index":84141},"timestamp":1667902886,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73696c766572)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x73696c766572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e2300000000000000050000000000003a98000101f95b8a5d8eca3b35b6a4835e43a0590b5bc55e644dba0998021224d66dd35130391b95daeae9c1b3a65ffeece332fec2758f6d26a9d16092d0a7a16586b1dc010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000673696c766572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062504686173680200000000086d657461646174610c00000004046e616d65020000000673696c766572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac30d9ea5321592df016f6a3fa91f07c6927d1e23","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":true},"operations":[],"transaction_identifier":{"hash":"0x3966476535d27fd412df7d6a1fcaf3c8e306bcf1bc758363fb8122b114ee9588"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e5f62)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e5f62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040012b54110318003cd57830756ce6864d3064afcd1000000000000000e0000000000000bb8000179a59c83ca0e0bf532d950cdaa87a3babb0e82b269611cf661f28c56d1e426950053fb17d620e950bfb3fbb3f2c5cea5e53559d2e54c02d73390e13f0436702e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008646f6d61696e5f62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062404686173680200000000086d657461646174610c00000004046e616d650200000008646f6d61696e5f62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a12b54110318003cd57830756ce6864d3064afcd1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST9BAG8G66007KAQGC3NDKK8CK9GCJQWT4KM4ASN","success":true},"operations":[],"transaction_identifier":{"hash":"0xcdeb744f3137f7f12d2b03e580bd725a0fa325a232a1f0af934e9dfdccb23563"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x53c90d72e3880f009ee702d650ba91afffb9e7eb43d8266408c1877f8590c7fa","index":84143},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000005a750436c38dba9642b2f1a582018295182c63bf1aacf35b7","index":2405331},"confirm_microblock_identifier":{"hash":"0x136483ed6b594344d625c6061dd17f343dd1acbb4cf98d364eb10893c3576c5a","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":30,"stacks_block_hash":"0xac9747ce77c75fccee1d7894d8c9f187295854c5fdca42d5de1d28853b547341"},"parent_block_identifier":{"hash":"0x814da5fdb43ad06322bada29203be8ac84a065620354ddb3229c0653878d4dd2","index":84142},"timestamp":1667904087,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x68657263756c6573)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":15000,"kind":{"data":{"args":["0x627463","0x68657263756c6573"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400293fab26b49ac31ac4d89467dc56fb6df4ce17b100000000000000020000000000003a980000e24ac54c58035f5efcac1d52b4863704c1ee67f7d274a1b8b236c8555063af1165dea77499a6aac3e14548409c3148442d3f084d7f71596fc5a2f565498fe9cc010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000868657263756c6573","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062604686173680200000000086d657461646174610c00000004046e616d65020000000868657263756c6573096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a293fab26b49ac31ac4d89467dc56fb6df4ce17b1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STMKZAS6PJDC66P4V2A6FQ2PZDPZ9KGQP4RWT9SR","success":true},"operations":[],"transaction_identifier":{"hash":"0x672edc4c3841d74f8ff350264065fa009aa275980c0183c2810961a47d96fa09"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9423e9b4e7206f55839dabbcfd39c1ad62d301e9d7b4591a7f9a7a4ecb75c750","index":84150},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000050c580ca9eba4eb398e08a7de472b467519bc12601c5493c81561daf","index":2405338},"confirm_microblock_identifier":{"hash":"0x4a98955900d274d8e2cebcab9470ef4c4cbc2843477a6a3c0a171be13ff19a6b","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":37,"stacks_block_hash":"0xb2abbe461c6ce36a2f0a2180ef83f3cd9192b7942a79b663690cc250cf447634"},"parent_block_identifier":{"hash":"0x53ad07caf88464a7ab1013bce62d7dba9f6050c8700d823bd306b706cf4755bf","index":84149},"timestamp":1667908997,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65636c69707365)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":75000,"kind":{"data":{"args":["0x627463","0x65636c69707365"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400554be47fb1be2e910dc77c29f7eec4025ac69943000000000000000000000000000124f80000adb66fa34b4c1c9069c72d6899dcfba8f6a83837ecb77186a1d22de9481051882e8a7721e0a785b5b2e9c5643ca48dcf2faf8e3d808fdff531664a703e31ab00010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000765636c69707365","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062704686173680200000000086d657461646174610c00000004046e616d65020000000765636c69707365096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a554be47fb1be2e910dc77c29f7eec4025ac69943","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1AMQS3ZP6Z2X48DRXY2KXZERG15NHMS8DZA1TZK","success":true},"operations":[],"transaction_identifier":{"hash":"0xf006210aa583fce91f7dd85e95a58ee3c50be27d15bbd70a74dbbad0af0f8642"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x04749c1d96075cf64c2435c1e02b17046c479f78c56631ca12e6f2e5467d3940","index":84151},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000c55b9874bc741b2905f7ac4332588102e5d353a6bfc6b304d36f","index":2405339},"confirm_microblock_identifier":{"hash":"0xa9be988e13ad2b423145e828d247a3e5d18a912e8570f9c0ac7af97d87f133dc","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":38,"stacks_block_hash":"0xe19070f9f2a209ae34243c1f7457c936cb2ea86511274bb04fa81681cfbf3141"},"parent_block_identifier":{"hash":"0x9423e9b4e7206f55839dabbcfd39c1ad62d301e9d7b4591a7f9a7a4ecb75c750","index":84150},"timestamp":1667910203,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696365637265616d)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":75000,"kind":{"data":{"args":["0x627463","0x696365637265616d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040005391f5d843a0c6b04fa89aa29b0ab833de58685000000000000000600000000000124f8000157a7b55665789af12392a716c497173dbf0318b2645bee29c0a8655b79daf44740e169be2620e6d2c75a4d689d7cd13c9850c95fbff6e9c3feb8841c21575423010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008696365637265616d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062804686173680200000000086d657461646174610c00000004046e616d650200000008696365637265616d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a05391f5d843a0c6b04fa89aa29b0ab833de58685","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2KJ7TXGGX0RTR4ZA4TMADGNE1KVSC6GQZ05QTX","success":true},"operations":[],"transaction_identifier":{"hash":"0x17ee2a7c6557169734f90a9f96a12ac8ba91548f324a33c309c1276e8bcf1691"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7c5d40d863a5ac17ae41239d7c9e463c51bebf63ebabdaa986c6bf11ee1c61f9","index":84153},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000ce5f5c9bb272bbbcd1fd1aeac2fbdb699f5c3243bddf13b8018","index":2405341},"confirm_microblock_identifier":{"hash":"0x8c52572f0617c6aac1a5e9e77ff84c288fe23555082a54c1dab8eae70096a59f","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":40,"stacks_block_hash":"0xc93e953b6e62bc38a08ee53ce2ce907b8240bed730258f5c88df9c812f535d9a"},"parent_block_identifier":{"hash":"0xfbd93958c4575df4a1b8a8ff674db8a8c03e9ab3d617710fb479d43ef86386df","index":84152},"timestamp":1667911888,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7072656461746f72)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x7072656461746f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e2300000000000000080000000000000bb80001669ea5554b2adb80560bc0d0a45699c2c5f928fd53cbaabf21cf1fde559e18ad67a8c1e5e6142e45a6a26ae0848dc69cdf0d098ec19156f86f97d82623b3c691010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087072656461746f72","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062a04686173680200000000086d657461646174610c00000004046e616d6502000000087072656461746f72096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac30d9ea5321592df016f6a3fa91f07c6927d1e23","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":true},"operations":[],"transaction_identifier":{"hash":"0x3095ec788bb7114fa6f5e9c02a171e9b12e8e20e2fd0abfb684025a219bd0440"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7072656461746f72)","execution_cost":{"read_count":12,"read_length":43975,"runtime":131860,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x7072656461746f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e23000000000000000900000000000124f80000c048e4484cc883619b59cafae1e72bf1a7ac708c1ea800d2a53d5d162492873173651d844386aaf90101247f5637a749ad61941da253d5285c7eb19799bede28010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087072656461746f72","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":false},"operations":[],"transaction_identifier":{"hash":"0xcffb96ac156520319c4d44b577d3b5f75d1cb8ca8d56ebc03c7bdd4d1f24d8d5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7072656461746f72)","execution_cost":{"read_count":12,"read_length":43975,"runtime":131860,"write_count":0,"write_length":0},"fee":12000,"kind":{"data":{"args":["0x627463","0x7072656461746f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e23000000000000000a0000000000002ee000012361337f1ec5c2b26f09114823aefe950c9471fd83bdd5790548f349fad2277c49b81171b9beedc7a6f29587d2b2cf2ded016f1016dd62c8064a7dc91af2eab0010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087072656461746f72","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":false},"operations":[],"transaction_identifier":{"hash":"0x2a2391431123fd23b9e7c0387781b274366225b6abc882506e8a969dc853e0ea"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1d92aabfc4dc7b7b480d29e05eb5531a6c1163d12780881a0749d8648ca04c54","index":84156},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002c5c805a946f04b950367e84b95d31b5f92903beb03108bbd3","index":2405344},"confirm_microblock_identifier":{"hash":"0xc072767d9ef3cbbb1dcbc7d187b95e533603b058128555483d4559cf199c626c","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":43,"stacks_block_hash":"0x235adba180fff7f8184f774bab192a5fae8e7eec433ece06d8405b706b118393"},"parent_block_identifier":{"hash":"0x7031cd1ca5b601f20f555a92ee9d7d1fade41444392e9b89f3b2c864e0e058f5","index":84155},"timestamp":1667914277,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d61727368616c)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":15000,"kind":{"data":{"args":["0x627463","0x6d61727368616c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b00000000000000050000000000003a9800007548c53f3ac45b22edaffe137b4e1b25904792daefe26c7c12947d712ea2e2775b59e288d3bac4d816221cd10b2bce67976ca3392a1cffee71e8eb33f686e42c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076d61727368616c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062c04686173680200000000086d657461646174610c00000004046e616d6502000000076d61727368616c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x30a28fa02248d2ce1dcee7b991cd6767dcccf682d0e9317b7dad19c920d36d9f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xde36796d53bd4334e7d851069fad9974d1c788391f37567ac06fa72c48ad06a5","index":84159},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003e9b00a2e957d698ef76eb56be0f7793a9f5e784831913c23e","index":2405348},"confirm_microblock_identifier":{"hash":"0xe9322b694ac212c4ca211ec1a7842eedaf38418d4f89e73b2019ba130cf3917c","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":47,"stacks_block_hash":"0xd2e075fedbdfd26bb71dfe37ba15ba9ad04bf0611c73286ca835b50e48b83304"},"parent_block_identifier":{"hash":"0x5d742033aafcd94c6a407519e843a4214e0b05bd59f141cb3a775fafb73befff","index":84158},"timestamp":1667916461,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6673646b766e7364)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":1875000,"kind":{"data":{"args":["0x627463","0x6673646b766e7364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000000800000000001c9c380001e07f90fcb1e1d829c66f120291a910926f6f54e96924f45cbaba0d6955667a12016838caa5fc95a6fc59e36591e3eb6c25debc8af53ab2ecb070f52ce1bf8369010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086673646b766e7364","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000062e04686173680200000000086d657461646174610c00000004046e616d6502000000086673646b766e7364096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0xf9a94d1a59c00db3650b3d9a23e6032312cd85831be3a0440bb406ec7bbcfd5a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4a9de5ed3db737218245446c382e59efa2dcbf3f80781125afdc39bcc29d8af5","index":84163},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000025c70ff050b783393f532e3d12cfb38467d06c524846df2c7453","index":2405352},"confirm_microblock_identifier":{"hash":"0xfa1ed00fef9fbc54c93a210346bc3dfc4c6e422501943ebe56390141ee2604d6","index":5},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":51,"stacks_block_hash":"0xef8a645a4f55c51821ca07659ea657d366d75f66053550386a8615e80c19a79c"},"parent_block_identifier":{"hash":"0xd6417d06924a2939822f8cc62e356581c4d38383706b4a876e0810426642975a","index":84162},"timestamp":1667918640,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x746573746e616d6531)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":375000,"kind":{"data":{"args":["0x627463","0x746573746e616d6531"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ccf133d2c282011b2866b6d71b6087d79385f55b0000000000000005000000000005b8d8000094a57c490a4e666a758b158e0a94c33bce7166ec0ce1eb3a5708d3a4a2527c4373844b9700fef7d21fb9788c6f657f4c9ed5428d5de2903b7fa1075868fbb6ff010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009746573746e616d6531","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063004686173680200000000086d657461646174610c00000004046e616d650200000009746573746e616d6531096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051accf133d2c282011b2866b6d71b6087d79385f55b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST36F2CYJRA1026S8CTVDE6V0GZBS71FNBD196NK8","success":true},"operations":[],"transaction_identifier":{"hash":"0xcf79789a7d4dd2dee669d234cf64bf57c500ab4e6a47c66d32cb006657217f2e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5c479bd87f4dd8ed875eac8f0b25a9efa1767469beeda833930291a2e3002036","index":84166},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000c2b49a10c0f1eec2fdfdb5eedaf3d2181da390d9f096bde507753f81","index":2405355},"confirm_microblock_identifier":{"hash":"0x95a3cea86bfb817103cbe1828974b5cf6d0f29ac2b0c9e9bd3cfe593b6b8c791","index":6},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":54,"stacks_block_hash":"0x4d2d2e73b07b0d8604e01d1dae0c8bed4518deed39b7a719c93b23dfc33c4eeb"},"parent_block_identifier":{"hash":"0x90780e890b84c7eafd0dd02c0306e2601e5e54e2dabcfae9944b8a090bf8ff97","index":84165},"timestamp":1667922258,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706c6f6b696a7568)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":15000,"kind":{"data":{"args":["0x627463","0x706c6f6b696a7568"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":136,"position":{"index":12},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e1600000000000000880000000000003a980001b73f4e3a9ba29f4faeb5d1524b04c5ca913d3dd344fd6d230268a384021f56e10e6d4d459f0b26159d41a694626fba9ec4b2429fd9f31dee7806cc9cb85436dd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008706c6f6b696a7568","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063204686173680200000000086d657461646174610c00000004046e616d650200000008706c6f6b696a7568096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0xe7e27064a4ce36273184af000a85a338565c87c40db029dd70b1b57a1bda2c02"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd82f49621eb4370f3bc9d2528f83176e08a654a46b70866cfa1b33af4b4d8037","index":84168},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003c07fba037afbe0f55a4c17e1b26fafde6230402965498666a","index":2405359},"confirm_microblock_identifier":{"hash":"0xd20eb55b52230fbf454cb5da18e43b69877169f9dbc366f07676d7b7196f3fd7","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":58,"stacks_block_hash":"0x1e945b3cd903507a5fea16a0bd9c439dc6cb4eec0fe25066ef780874bf230ee3"},"parent_block_identifier":{"hash":"0x7eeeb2f243ba9f47eee485b23187b809b9cc6bcad4a2d0c8482112602a968c25","index":84167},"timestamp":1667923730,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b696e676b6f6e67)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":1875000,"kind":{"data":{"args":["0x627463","0x6b696e676b6f6e67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040066305e8ed22f8c232269f857e5d71c84f7e66a3b000000000000000400000000001c9c380000b9be51ffb5d0a85b2cbcaaa1d8407309c61751cbc0ef80a6838667f752305256031dd6e35cacc12a700dd7f125c3410bf3914ed29cb2412ee7f9571f092b6940010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086b696e676b6f6e67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063404686173680200000000086d657461646174610c00000004046e616d6502000000086b696e676b6f6e67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a66305e8ed22f8c232269f857e5d71c84f7e66a3b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K30QMET8QRR8S2D7W5FSEQ3J2FFSKA7CWBD15K","success":true},"operations":[],"transaction_identifier":{"hash":"0xcb03e94d7def16496f5706306828edf2c36b50e3cb69946375d5a1dd087d6d8f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3d140422d723d9210685c08e9bceb40ec8d6176c0a41ca47f4f51d62333da54a","index":84174},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000261f76cbca3981b688d8a0d2219250c445f969da00a4e0de24","index":2405365},"confirm_microblock_identifier":null,"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":64,"stacks_block_hash":"0x214c95def44d56df71e583e27b2c5b33b1bcbd8addb6e8bd3d5647ed14e01765"},"parent_block_identifier":{"hash":"0x20c440685652c1e60395419747cd4728a8127ffb880411296659393fe5e9bca0","index":84173},"timestamp":1667926565,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x64656c657465"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a830b5b6ba9b1987d1a4eba94533e2e0ebfca32400000000000000020000000000003a9800011558588d7c047d6f9b773603626e90523778ed357e79a4b01a459cd96c2a3aaa3b421362b626d08681b98d721d427335f539889157232ef1538079f6a8ba5197010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000664656c657465","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063604686173680200000000086d657461646174610c00000004046e616d65020000000664656c657465096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa830b5b6ba9b1987d1a4eba94533e2e0ebfca324","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2M31DDPQADHK1YHMKNTJH9KWBGEQZ534G9Z87JN","success":true},"operations":[],"transaction_identifier":{"hash":"0x12dc98607bfc0500fcceba764adb3ae57d30daecb9eafec73aa140fae6e5c097"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x64656c657465"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a830b5b6ba9b1987d1a4eba94533e2e0ebfca32400000000000000030000000000000bb80000a7df016400ecadf48588b275770813a6fe5f6947a433fcc8705b3f209e4950a511c843642f9cd2e66536fd94c1dbfa90460701c99bd545ca1f656c0f09c4f747010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000664656c657465","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2M31DDPQADHK1YHMKNTJH9KWBGEQZ534G9Z87JN","success":false},"operations":[],"transaction_identifier":{"hash":"0x64dd6928a33e81ba11f468fbf06b69d88cc7fb075791fd9501f46af2538e04d7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd035fdbcc3ff07d332454167d161b301f5bf46996d7255bfca15e332b2ac8203","index":84179},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000570e78a7e7865c7f485252971c1495e8842bba1bd97ee9070600","index":2405370},"confirm_microblock_identifier":{"hash":"0x1fc4f35899f92576b0bfa10045aedbed88e560738971e241b9bb011c0d90aa60","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":69,"stacks_block_hash":"0x1ff52eceb118277e826d9ae4b89daf9c5cfad93b1409a1b8e9b8c9accecd6729"},"parent_block_identifier":{"hash":"0xce242aa67748b2ddfb212ce8b3b08dd0d35a6f2f95b8cabec1630672022831b7","index":84178},"timestamp":1667930926,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":75000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef09659000000000000000500000000000124f800014cf63df5cd4f808271dd4a938844606aa3f8e14fad07ba18fb439f9947d6da9322f1ac559b613681f4b2ab9fd138acc9bc42be20a401b049554ec3a9466633e2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063804686173680200000000086d657461646174610c00000004046e616d65020000000774696e74617368096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a65a21f6c2fe4aede58afa9760e32988d5ef09659","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":true},"operations":[],"transaction_identifier":{"hash":"0xe80fe11d386ed63a84c7b081e92cd605d2125d5f59aa9d2b06e6334198ff2ea5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef0965900000000000000060000000000003a980001c0e0861141655141b287ef5c364e0f8a42a8f26100568f3466cff79ba819fcc9382d86b667f3303294993a35b75e2c936ce0eb20dd114f416a81b070aabf7032010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0x859d6667109ab06d949f4a5aaa4882c02b87afc252f4a9e138e021128b6b3fb6"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef0965900000000000000070000000000003a98000026665596eaad49b940a763dda946064b8bac1f112de4ae78ffb5a0c08ecde37547ddd8b166562735c3e513ece5f057caebbeab40f0792b70ab868c36a676d309010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0xceced1e9565fd1e4aed928766ea7d122294e1625570c241fa81a81b071e400bc"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":375000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef096590000000000000008000000000005b8d80000c13974b8ee27af7db231615e7a82235116c886af1c113bf8057498f7048b81176eab7abd8fb7dd511910819b70172a45ee9901d120699033e30b43a55a094481010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0x569190ff7d5a6e8f53c3f82fcaac854f9129c4cc7db99bf5db07526c59d8abb7"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":5},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef0965900000000000000090000000000003a9800015a1620e5789c5d9d531c0ef1380be193c3c2de2587b985f3248896294c44b535324099c70bce1dbbd845285f066692f41e7e39a68be050fbbe46905d78e2d7e7010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0xc4b2095596e3593c07ac7b03a9541ce17e0cb015371792c9ec92973426eb97cf"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":9375000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef09659000000000000000a00000000008f0d1800000133820867e11ab0216aae42bea8bd51e0a60f303b7752cd42e7665ad35b628725cfe6be712c3a405e43a965fbc088c89d8e0ff2c1fe2a4987c591f926daa4ce010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0xdc7fcde9a2b90d06b298874ef2198ef6e7846994cd3e5224023396bea1aa62c4"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74696e74617368)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x74696e74617368"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":7},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef09659000000000000000b0000000000000bb80001534ba1f20fa7ad1223a09ccc73f548ac465e714b7791ec7bd18ab188a4db39e17d3879e1985b9334382f84e001fa6a66aac90a5efac084e6c817ecd77ac549e3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774696e74617368","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":false},"operations":[],"transaction_identifier":{"hash":"0xcd14e189b0d618d931671c9fee6d9ee697868d078552056943a34e87c59ad213"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x82a04d12c597cefc96602c6e96a9d968f313299c6cbeda11c7b66b74907dd527","index":84181},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000d6bda83c4be84e20b08084010b11030c483f57e507e376bf849d","index":2405373},"confirm_microblock_identifier":{"hash":"0x7b0027a184a1ce960c4fd6151d2dceac43b81fa9d92e1e16e08c7365a1c263b4","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":72,"stacks_block_hash":"0x980820b23997f9ba49b0b8316d4ec0c738ae01336a457b2c7a45ea1b08f97548"},"parent_block_identifier":{"hash":"0xc1e71a95608e0bb154feb44a2fc8e0255313e35dbf436cf445555294d5d472eb","index":84180},"timestamp":1667933349,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":75000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e559000000000000000200000000000124f800007dbe29c86d52de0235aaa5b22bf3f5708c1f74242bdd872b6f056f174a5b54b04d06bab02b58e0afe5daa5a0f7aa4803691fb2c18ebedff710397f59ed8a68af010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063a04686173680200000000086d657461646174610c00000004046e616d650200000006676f676f676f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aed00fb06edc442679f772c1776e0dd695f85e559","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":true},"operations":[],"transaction_identifier":{"hash":"0xd1485662158b9ddf9cd255f00653dd6ed8dacc4b355362d014a81e39faf0328b"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e559000000000000000300000000000124f8000027a9ef65c27adac89591866a3dce73a4d73c0fc366f026229a45f2d8b1b029531b600a13e9884044c08c7fdea117ac78d80804a535bff3f259a16106b0b9cb27010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":false},"operations":[],"transaction_identifier":{"hash":"0xca23b3e377d66dfc4d10cb272ad6ae44b9c99544066be3b2d642f67767031296"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e559000000000000000400000000000124f80001d1658572050c4315cb6af03a7b2b9d0e71764ea2d2b785235cf65d3c31719e1a579b8c595366b990aebb3c05a673ac8ad104915a9e9e565a29bd4f2167c7c4e2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":false},"operations":[],"transaction_identifier":{"hash":"0x3c6dd5abf49f30cc21a9169d9535168aa713ff8a17302b21eba194836e5d15a4"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636c6f636b636861696e)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":15000,"kind":{"data":{"args":["0x627463","0x636c6f636b636861696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ce20107969127908f07c1f8e09e8e9a1f14681cc00000000000000090000000000003a9800019b22438985e13f6a29a96131eca3cc24664e23eedb5db91002c8fb3cfbc72c6e317ec8fe4a50ce2ae6539d2935f5b2bbe129d4c10f861f2cf4b81690cdd2901e010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a636c6f636b636861696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063b04686173680200000000086d657461646174610c00000004046e616d65020000000a636c6f636b636861696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ace20107969127908f07c1f8e09e8e9a1f14681cc","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST372043SD497J27GFGFRW2F8X6GZ2HM1SJ2T5AZX","success":true},"operations":[],"transaction_identifier":{"hash":"0xccd67f652bc87393e42c21b7a7550dca6d789334a5549fdca581868269e30241"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x84fdddd9b77657de37963ac7006b28c061252396b9cd4d9a208a405e22c75aa5","index":84182},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001b7cfe52989e034e76fe82a7e47d8bdae5ec47d350cdefbc70","index":2405374},"confirm_microblock_identifier":{"hash":"0xb3d5150db772d0c30c50d7968c27309466076bce68e06ef8f4b39ba05b90fd88","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":73,"stacks_block_hash":"0xa700c65d1b180b8e094e411cd43e17e57973ac74a6ccc6c610e1244afe2524d6"},"parent_block_identifier":{"hash":"0x82a04d12c597cefc96602c6e96a9d968f313299c6cbeda11c7b66b74907dd527","index":84181},"timestamp":1667934550,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e55900000000000000050000000000003a980000300fc6ef6e6453dd3f1f9f4e3170fa22aee4c33a2ce9d47789788d6f5e253f004f12160cfee140435b9cdc80038665931d8d8441076759413177ae264c4383bd010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":false},"operations":[],"transaction_identifier":{"hash":"0x15aaa05351300225c22c95b5f1aeeb80acec285285d153e59fca97bc057031f2"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e55900000000000000060000000000003a98000149451e0d1c7bb03f88e30d099b99b1f8effdb7bbfc80a6dc21ecd315f5f3957135c87b9d3ca4c4a9e94f1e426dde4766e191a1867ea980b85b4a8c78f3a09572010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":false},"operations":[],"transaction_identifier":{"hash":"0x8b144c1c42867aeb3f9cb70ed682fae9bf83cd1a13870ba0aa514d5ed9255517"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676f676f676f)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x676f676f676f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e55900000000000000070000000000003a980000513f9b7195cae252537b22d8583102753b6d11c89050d85516ce38407771968e3673efe85edbbbd62a6be15ea40e0f5124e75d5d167b4b903aabe1ee5f82489d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006676f676f676f","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":false},"operations":[],"transaction_identifier":{"hash":"0xffa29f42441a7ee3216024c145fe8e1130b5928ab46eca045136918c80e62b9e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8982189057adf4817fb91315b2d17951033ae1f9c05443e9e3ff33b32f25e2e4","index":84185},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000012125343ad5e1b90bf65e0bb1b1f4eaef1b82831b0edf68cd2","index":2405378},"confirm_microblock_identifier":null,"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":77,"stacks_block_hash":"0xe8e8d33b154dd04601f4b242e6ea7ddcfcd9d99bb658a381c95484ba3d7e4534"},"parent_block_identifier":{"hash":"0x62d1ced949dd7f28985b3b3212f1486c091e8aa23e6aed31c4425292583eb6fe","index":84184},"timestamp":1667937053,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666966696669)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x666966696669"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db00000000000000020000000000003a980000b151939d0200a5de4d506c3c87e9eb267cc471cab939ff1c9f7b2d8e7470bfc4570dc1c48b86532c77d5bbe4277cdc4b7d7b201fbd95194165799d71a96f4850010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006666966696669","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063d04686173680200000000086d657461646174610c00000004046e616d650200000006666966696669096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63fd7ec23b0085b49757329fa19c299988153db","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":true},"operations":[],"transaction_identifier":{"hash":"0x752a1f45b953d36b9b283ca233c04f513e3e2f57316469727e3abf5315df3cb4"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666966696669)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x666966696669"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db000000000000000300000000000124f800018ee5e85e99c6197d2bc7545b76bae1f87b42cdfa864f8fa70ecfbde73fd87d1b20ae68f0d89628b3fc5158e93f885296a88fc8271da84cac8a63ce93b66444e6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006666966696669","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":false},"operations":[],"transaction_identifier":{"hash":"0xd2a12e81631729527c8285e39f6245fa04703656db6113dc38a96fbc9169bc51"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x269d31e2f1d5e7383698872ac1cce754db0dbf661a3f24b4a1a31e2f21e5578e","index":84187},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000072d85d2c73f4749cbd3eb3f7cbcc68207de915a838612b2ba6db44ad","index":2405380},"confirm_microblock_identifier":{"hash":"0x90556f6789a76e878bbcc4af3010a6341c1a748997832116c6748461bbe3c8b3","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":79,"stacks_block_hash":"0x1986ede687b8c3cd196235011657ef0e61d6db1fb5f504e9c2c72184694fe07b"},"parent_block_identifier":{"hash":"0xfe1fea6385a632b817a9bb01031eb2fe69dd141eb423c51cce8ed35c6547e628","index":84186},"timestamp":1667938502,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6173706572)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x6a6173706572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed00000000000000050000000000003a980001b994b7b156ed2bc7819cd86962473c76be9605dc922be9f32b0d9154f41f1d6572be37cf93e0b11cd40cc0c34052b218b72f1adba2e2cbdfeaab7037ce7b1fa2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066a6173706572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000063f04686173680200000000086d657461646174610c00000004046e616d6502000000066a6173706572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c787d6b138e08668836c65ffe49a09ba4ac99ed","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":true},"operations":[],"transaction_identifier":{"hash":"0x259fc075621805844ca9fb95f239fcfaad6005272e9fff80cf75cf0e327a20a1"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6173706572)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x6a6173706572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed00000000000000060000000000003a98000026d1ef3c12fd5356ca409944a08e161ac17e2bab7d4f303315e1e9dd5006625b64906aef518bc2bad97ebe007b3ba2e07bc07be928d83fadc3e741725eb62b4c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066a6173706572","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":false},"operations":[],"transaction_identifier":{"hash":"0x8d6b34d3ddf0c66ab33029f21eb0c0d38c513973fc4350863ecc20deb78e1a50"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6173706572)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x6a6173706572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed00000000000000070000000000003a980001e453fd21cd4b4d2891060b27cb2524b34c6bf75b06ad089db3349d882bec8592349625f38b2087d778ceb55a83cd8b273a4f9c39b29f43a789718ee7c9c41036010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066a6173706572","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":false},"operations":[],"transaction_identifier":{"hash":"0x4fd8182544c30e4de02a47cb7e921d18865fda5995b1d4ba0270516e3a3b3911"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb7e23d3e3c458188fff1f644a16f3687772743781799744bce8ce2aa824f09f1","index":84189},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000040b0e0e77d1c761056fe0bf1fd25cfb946e6bb89255ecfbf15","index":2405383},"confirm_microblock_identifier":{"hash":"0xdbf8ce6aa9cec952d2048d41dc1eeee38ace2b3cdbd5161ab8d966c3a550281c","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":82,"stacks_block_hash":"0x174afbc8d8604647f4a1932fd01e38339572aa27ec51dd4f2c638094ddb177fa"},"parent_block_identifier":{"hash":"0x2227a783512a1a407cc253ead9fa98f40b1b34867932461b6f76b6c18898c561","index":84188},"timestamp":1667940147,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":1875000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000200000000001c9c380001c8dba3eb7a40df74a9ca721af85e87a2d2e91a79bf957999540053a474fb30e2475d6ecad95bf1641050751a74f48f5c2b5e60c2ad1ec1fde1eba6abd9f722f7010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000064104686173680200000000086d657461646174610c00000004046e616d650200000006717765727479096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aac192c794b03f59bbf7bd4b0ee9b002f271fdd94","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x0d5bd261a4292f3db5e824408e0195abc8d89833782147d6c8e59f1098786f03"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000300000000000124f80000d11101efb4f5d3e6d280a352675922a0d2895286cf52ef427f923ee3f8ef51a025ba479ad07cc5f144bcad11d1f10aca1d5f30cb344843322196d88e32179cb6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":false},"operations":[],"transaction_identifier":{"hash":"0x3c64277758b068cab09aef4a04a76be9f23bacb674897deaddcb6aee78925958"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000400000000000124f80000d4a46959aa80a6c119e10a9442b8498dcddacc03dadb4cb719acc909ada2939b5f7cb82d559e99f047668daa4297d7fa038ae95fc07fe87c3d7add937321883c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":false},"operations":[],"transaction_identifier":{"hash":"0x44e46f2570d4cb2b90742e1ab179287ca676254a58451251555aabdf3485e807"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":9375000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000500000000008f0d180001c0cd399db6950ae87debdf57125f648e3b5dcc4aede63b28ea339c80059b732574db218a46a97d9a5a2f4d07f10a406075b1fae28928f4a6e327f06adc685290010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":false},"operations":[],"transaction_identifier":{"hash":"0x20ff30538fdc58fce6a268cf3de27a232274b0525764ce5ab3ddf3f8d0b8f041"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":1875000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000600000000001c9c38000056b7508d71cdbc0eee0f301c698eb7c859398ca383f4ece9db5c07911610812f09e5ed62634d418b0a35198d9f99a829605b8ecebf1efe1955916dd526fc9b1b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":false},"operations":[],"transaction_identifier":{"hash":"0x6fdf5699d3548852331983b4a8e54391861e2ffac347c3f33e6abc0e860e076d"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x717765727479)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x717765727479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd9400000000000000070000000000003a980001e7bc2be26b5773a92a1739b083eb3123655bf9e24e6753ac8e00eef2e153ca7a1d6857360c5710dc4f1be7c31c6c4e793eb1bae8e0f1d02e772c5383da17a17b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006717765727479","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":false},"operations":[],"transaction_identifier":{"hash":"0xc6cae283a2df8a1d85067694ca5a86e7f2c5b59f40f28e1f84187766c0bfc1d8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x07446de4b1a761eb6e162267dedcb4d2401d28f8d76c30b74d139c87711b348b","index":84190},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000202c9a30a3f3f2a20d7b7bc5e8b787e159afcf0880e4d268f63c","index":2405384},"confirm_microblock_identifier":{"hash":"0x48ba01ff8198ce25070dec9f82a065838291c7dbc34af1ced72ca11a70ebf563","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":83,"stacks_block_hash":"0x2b956c7190c27543dfac1f5dc59fde3224c6b631bf0f3dbf8d31a156d0507237"},"parent_block_identifier":{"hash":"0xb7e23d3e3c458188fff1f644a16f3687772743781799744bce8ce2aa824f09f1","index":84189},"timestamp":1667941180,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a617370657273)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":1875000,"kind":{"data":{"args":["0x627463","0x6a617370657273"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed000000000000000a00000000001c9c380000316ef8cc2348f1b44e55ca2aa4d442064db982143b5e5c6e38bcc8656360c8892270dd544ccec5f2f8c442c27e23f0fee5e4b0254184eb559c55ba082772da6b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a617370657273","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000064304686173680200000000086d657461646174610c00000004046e616d6502000000076a617370657273096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c787d6b138e08668836c65ffe49a09ba4ac99ed","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":true},"operations":[],"transaction_identifier":{"hash":"0x85f6da2f0e27bf0b7a90380526c7233461fe8de376f7c129db12d3fee8a54ab5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a617370657273)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x6a617370657273"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed000000000000000b00000000000124f80001eca11f248e69c1bbc862e8a2c074ab751e6c59cfedb92c68526b0558ee9a16fc5d707290e80df7528ae6370d95fa7affde497f340ba065c60c94db8bb288f45f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a617370657273","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":false},"operations":[],"transaction_identifier":{"hash":"0x66fd1468e5d0b1450f9d81b1ce7ab5c327fd58a22408d654e732b20d7d79c01c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a617370657273)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":9375000,"kind":{"data":{"args":["0x627463","0x6a617370657273"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed000000000000000c00000000008f0d1800006a800caeb7f3e01e6ca203c4dabd613e03e1ca84d995c8cd9cded7183fe4bf23078cee31e2e62923016173076378296d7d117439656ea672314445563e51a9aa010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a617370657273","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":false},"operations":[],"transaction_identifier":{"hash":"0xf0448a6d9f6a092a97e6452022b640cf0c099cab3627383fdeec6684687f87b8"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a617370657273)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a617370657273"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":13,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004006c787d6b138e08668836c65ffe49a09ba4ac99ed000000000000000d0000000000000bb80001ac2b8382a1e2ec714d11b8102befd3760cc63484a81055448799359de432ebd52b38f29979fbcca2efef18096363783bad52f923e86a677c196fd5d9ee93d7e8010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a617370657273","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST1P7GZBB2E70GSM86V35ZZJ9M2DT9B4SXPY7GACY","success":false},"operations":[],"transaction_identifier":{"hash":"0xccc796254bbddf6c59265a111a615f1159f3e578c15be9df514081fafe339c84"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1dfaefd887102650a59b6957544611c55763cb6324b4b68008b02b045ab75f8b","index":84195},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000a148e35e9a4ad13c04b7613af931f94baa0ce933b8ac290cb30","index":2405391},"confirm_microblock_identifier":{"hash":"0x7113ba3f0978abdfd527f8a1d26056e973ce61778a892bacdd05ec9d7f2f464a","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":90,"stacks_block_hash":"0x467e9e9c51d709b6e8d0bc42f1c825dbedc814d0b38767fefe139b1054ddc676"},"parent_block_identifier":{"hash":"0xc1b2852a1b372f5b60f2a150590f7a59410523b21a023bd4031f29fa7fea2292","index":84194},"timestamp":1667945050,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74757475747574)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":468750000,"kind":{"data":{"args":["0x627463","0x74757475747574"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000a000000001bf08eb000009cdcfb0f9cf83e39bbe49845c4c08b849f5db193808e2427bd2cb7e1d931ce967d0aa8069b71fee5d3517822fce463b4f1d673c4e9215fd5f2b42f4c6906eae7010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774757475747574","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000064504686173680200000000086d657461646174610c00000004046e616d65020000000774757475747574096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aac192c794b03f59bbf7bd4b0ee9b002f271fdd94","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x1bec9d280529fbbdf8684ecb9f48aa3512f8fbdbb16e9e629786ec76dcb94314"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe8968580d724697e8faadfb21ee8d800dd289438987865b42f9066e234fa6e51","index":84232},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000026739b1f188a3338e1c19c987b89b07ef29e164eec696c28bc","index":2405433},"confirm_microblock_identifier":{"hash":"0x2516e8e7ede1b088a9c4271ee3dd83d357fea97d68318474e3be8dae96133267","index":0},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":132,"stacks_block_hash":"0x4b0bff6d61939a56b5b2d5878bba6f877e4aec071b15defb6911236108b0ef88"},"parent_block_identifier":{"hash":"0xa785ab8a811434a72e67beaec36ec8ac1b811a5cfe783437ba0201678f8f4e60","index":84231},"timestamp":1667973663,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616161616161)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":9375000,"kind":{"data":{"args":["0x627463","0x616161616161"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db000000000000000600000000008f0d18000090c470883648082ebf832400a2b992995aa10e6dac1c6d3c53bae7d8eb69a22f34537726cf01561ca2b1ebfd84d2f8a3a4df1477b8ec9d366aaea4abb7a36fdd010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006616161616161","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000064804686173680200000000086d657461646174610c00000004046e616d650200000006616161616161096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63fd7ec23b0085b49757329fa19c299988153db","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":true},"operations":[],"transaction_identifier":{"hash":"0xac3107e3324e9600201c06e886822afec3c9096d24b23977b01aba206ff02817"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5b4081c341b2eb6c0c046697e95487d9efa352bbbf01d86ed56bb84c736c25a4","index":84260},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000dece57f879c11e9afc3c7d1670876b72b4f6e46b4a63216f37c8","index":2405462},"confirm_microblock_identifier":{"hash":"0xf3a6abdd47d01b0b914112bb876813a5fdff1acd7a507093ff034eb4287d71eb","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":161,"stacks_block_hash":"0x5cc3256965e959713fcf9eda39730560c8a19b0a4f726e84a36db7cf0383c5e6"},"parent_block_identifier":{"hash":"0xf7911f1777b043095bdf5c001a901dcd8f6c9029be1a5f555f207aefa2eb8208","index":84259},"timestamp":1667988841,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f72766574)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":12000,"kind":{"data":{"args":["0x627463","0x636f72766574"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040066305e8ed22f8c232269f857e5d71c84f7e66a3b00000000000000070000000000002ee0000105e32c0a41df16838f39a1f207eca1e844d13696ee46a029727501d0afe9b46855037024948676373352689c5d44387a74009158ce035e1333d30b0b104a9946010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006636f72766574","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065004686173680200000000086d657461646174610c00000004046e616d650200000006636f72766574096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a66305e8ed22f8c232269f857e5d71c84f7e66a3b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K30QMET8QRR8S2D7W5FSEQ3J2FFSKA7CWBD15K","success":true},"operations":[],"transaction_identifier":{"hash":"0x96db817ab25e578327273322ac6ec4bb80618b3a61573a60b91c285d65f52117"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9b0e45ad681a81d7d83294fe1caa4c4eb3d57b11c6e819cfe3ef78cf5eccaf07","index":84261},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001ed62f042751d4df222ddfa6b8ce62d4a2646192b327ef8310","index":2405464},"confirm_microblock_identifier":{"hash":"0x8534d1d6584df8a73f671b65718a452f56c17923f8a54a0069f07a089c0794df","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":163,"stacks_block_hash":"0xd5bab366d60634ceae93c1a1fa5e00aa9591228a773c3d81f80bd73f3bd28729"},"parent_block_identifier":{"hash":"0x5b4081c341b2eb6c0c046697e95487d9efa352bbbf01d86ed56bb84c736c25a4","index":84260},"timestamp":1667990062,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636363636363)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":24000,"kind":{"data":{"args":["0x627463","0x636363636363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000060000000000005dc0000196747fd7192bae8c86511be2bf2fb2e23bb5756bb45fa19b54a3c8d19073fb6b1c6c847defdeab1e5e46714667e72df10ad446d90ef5e3972c105bd075bac46b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006636363636363","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065104686173680200000000086d657461646174610c00000004046e616d650200000006636363636363096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x66151abf98c0a6ad4e130f80c77fe1aa9a46dcc5bb5abfbeb8f8e77217c9c952"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636363636363)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":24000,"kind":{"data":{"args":["0x627463","0x636363636363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000070000000000005dc00000528ca60bc84f68713b3a31f48c0ebeb816ab1199716923963f79b3886ce5625e6d9560eff1d4e5041137b283b03d21e776ebd925180a9542624724761b7dfd19010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006636363636363","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":false},"operations":[],"transaction_identifier":{"hash":"0x787e7de9f843db85fa9bb5c080849ccf7d052571a84be20c604bf050908688e0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":12000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":13,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e23000000000000000d0000000000002ee000017ad752c20764e19f51c8a7dc1ec7c109dd0bd820022912114bc9fb97a7f78d90616b5d1896e51f4c31e4688e9a0e890cc4a7336d5c021b1b4eeaaedc792c7eb7010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065204686173680200000000086d657461646174610c00000004046e616d6502000000057a7a7a7a7a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac30d9ea5321592df016f6a3fa91f07c6927d1e23","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":true},"operations":[],"transaction_identifier":{"hash":"0xc3033431947c9aa279663501079d7edead5fe76948948202d5df2a3f775b3b07"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a)","execution_cost":{"read_count":12,"read_length":43966,"runtime":131782,"write_count":0,"write_length":0},"fee":6000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e23000000000000000e000000000000177000012250741bda88b19db1644ba06b04852885b99952f41ac0ea5171ba96f0f2bfc631f912b14ec5fff9a50b2adbedfc43afe7d015b01cbcb08dc1ef00bbb8bf4161010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":false},"operations":[],"transaction_identifier":{"hash":"0xfc7bacf43eb2763850aa1608f142bff772d940a8295712867f59ac58e150a5fb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfd1994c93b7b632dbc0af6b71b6568bc856be0db0530c47ee9b3cc9bdcc8502e","index":84263},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002f39e33c2860807c85d510d52afe805c49ce97f129a61ef381","index":2405466},"confirm_microblock_identifier":{"hash":"0x62e26d6249a1ebb39d92682055e3a54868126cee8b1e10984056fefa7bf5beea","index":6},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":165,"stacks_block_hash":"0x17cd97d4604a82d4f7e52b0ba1c373986699da9fd6a90b585a537bb5e38f7ea4"},"parent_block_identifier":{"hash":"0x3fd17ea0c6e12c5544e82999b15af87d9f3990f963de1444f6069994e6418f9a","index":84262},"timestamp":1667991746,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x627261766f)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":24000,"kind":{"data":{"args":["0x627463","0x627261766f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c80f061403e91afa78165a08819dff011fc2f54100000000000000050000000000005dc00000e1274b1ef12fceaa3e5fca1b3e245a569e8ff12e1078f73b95dd8b98a0a7f68906e9bedf1b851c24da22111796810930e914ec0e3b5bfe2e5c9fb756ccd4e43b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005627261766f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065304686173680200000000086d657461646174610c00000004046e616d650200000005627261766f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac80f061403e91afa78165a08819dff011fc2f541","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST340Y1GM0FMHNYKR2SD0H0CXZW0HZGQN87JDTXCJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xb55a571fcafeaba7e3357519ad77bf6d7bc6f2ba0087afef8be47cfa58036007"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636861726c6965)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":6000,"kind":{"data":{"args":["0x627463","0x636861726c6965"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000000b00000000000017700001817b428a4d78c01d35f8ce16e56f5dc1da91c914c9958c7e5e79ab0c21909546150c6d6b396163e1e9a2ef03f2f2d65735f28558420affa3ea54e0575854e214010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007636861726c6965","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065404686173680200000000086d657461646174610c00000004046e616d650200000007636861726c6965096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x7f3864a759cdfc98f1e5ca51f3e4239bd41a90ea2a66903245dc575cbb664302"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636861726c6965)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":24000,"kind":{"data":{"args":["0x627463","0x636861726c6965"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000000c0000000000005dc0000195e1cfd392cf0fb48e920699c95503d8fea59a7eade31ded48207d11151e73a16d052a396a64807949fd68c120b78d60e7fc64f43b8fa01cd16f029e1cdbba79010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007636861726c6965","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":false},"operations":[],"transaction_identifier":{"hash":"0x9dbb2d3b56bece6fb15d3da66dc293ed5bdfa1d3223bdb1d4819020e8878401b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd61cb5464acd028d227dc0d61351e8a9e0bacecb236b9fecc7e92a7d9a2f12fd","index":84267},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000297880e6cb527e1d1373bd56d2c9438c4b18026d26784dbd53","index":2405470},"confirm_microblock_identifier":null,"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":169,"stacks_block_hash":"0xb659e6c64e7386adf2af45dd7e25e5f91a11c4b48e1e0d3181f1200075d64e77"},"parent_block_identifier":{"hash":"0xdde99e4290ed39d60231f23563ee312e1295d75f6e25c04cfae1f233b181e61e","index":84266},"timestamp":1667994441,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626262626262626262)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":24000,"kind":{"data":{"args":["0x627463","0x626262626262626262"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":13,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ac192c794b03f59bbf7bd4b0ee9b002f271fdd94000000000000000d0000000000005dc000011778bb4f09c4774c403f237a5b7df4f4b669457ef7085e9bd7155c04951ad6a668c927200ada31281541e843dc27335b1ef58796752dae9bf02226c2735256ff010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009626262626262626262","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065504686173680200000000086d657461646174610c00000004046e616d650200000009626262626262626262096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aac192c794b03f59bbf7bd4b0ee9b002f271fdd94","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2P1JB3S9C1ZB6XZFFAB1VMV00QJE7YXJKMXDN6J","success":true},"operations":[],"transaction_identifier":{"hash":"0xdd2bcc30fdae50d4702d1245d1372cd6f3fd9b2b8fde44eb78bf6721eafb8d0e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x267a2c6078aa357dc89a9b50a272fe3c087b52928e507bea77896a0254b6228f","index":84316},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000043c5a546ac00091a515dcf9a62a9dbc0cd6249234b41464a53","index":2405526},"confirm_microblock_identifier":{"hash":"0x09f8e7f561ae81608da74d08b7c90e7ddbb62a4cf052946289cf3625f5ba2bf8","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":225,"stacks_block_hash":"0x79c8be299ae3db7d7ad24b8bfae3cad482db1899534185af1801007287071453"},"parent_block_identifier":{"hash":"0xe33a9b5beba71d06ca4d512e31b5fda2823e7d0175d043dd150e8b500d9a609d","index":84315},"timestamp":1668021369,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646667646667)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3500,"kind":{"data":{"args":["0x627463","0x646667646667"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":21,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400e9ee5be86ec9e38e491aef3993dc1c248d2bf7ba00000000000000150000000000000dac000089ad06049db608f67863e8c3529434bfaf3baaf6793eb04931dcadb1e5fa3fe70a8a0a0b31e58c864e18f67caeb53fd5b50d4a9bc56ed54a8ba212e0298b5e1f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646667646667","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065a04686173680200000000086d657461646174610c00000004046e616d650200000006646667646667096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae9ee5be86ec9e38e491aef3993dc1c248d2bf7ba","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3MYWPZ8DV4Y73J93BQKK4YW3GJ8TAZQQAFSRYNS","success":true},"operations":[],"transaction_identifier":{"hash":"0xe22b8530b5e4270a42da99cedabfea436fdb00b47cee06dd68f299887e978436"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa653dd7c0740a17857a2899cc44764d6ba0477ffbe2f14a41e0a1bb060dd415f","index":84317},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000b75d51027303f42479a1a3c4b25bad6d5e55f3381007448c6","index":2405527},"confirm_microblock_identifier":{"hash":"0x930fb17d3836ec9ff0441e7a61bb2447f2d9e761742d41886c19dd8e85d4a0c4","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":226,"stacks_block_hash":"0xc9c016e13fe99e58d5f0010d62fad7898b7fce2d3bfb71b74291e0233374f7a9"},"parent_block_identifier":{"hash":"0x267a2c6078aa357dc89a9b50a272fe3c087b52928e507bea77896a0254b6228f","index":84316},"timestamp":1668021851,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x313233313332)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3500,"kind":{"data":{"args":["0x627463","0x313233313332"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005cd708cae3bfab26be5838dd1080b274f4d4105e000000000000000f0000000000000dac000191f77d05b2e247df363785fce483153a02e6dedeb88db250cd2673194879113e24787694c8d58ddf778e384520919c27892c8d69b3ab9d7f13811999a93dd7e3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006313233313332","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000065b04686173680200000000086d657461646174610c00000004046e616d650200000006313233313332096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5cd708cae3bfab26be5838dd1080b274f4d4105e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EDE26AWEZTP9NYB0WDT440P9TF9N0GBSVH21VS","success":true},"operations":[],"transaction_identifier":{"hash":"0x6ad3d2b500df0fbe7ed9c365f6d02c7dcf23307ddce519c4f98ec2a4dcb92e48"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x53c7e3eb4ab18f36b3af742fe2fc1beea372608c28019bce92906eef5190b30d","index":84523},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000f5d0e4720e903e305433c00f8b5a35358202f20700fbcabcdf7e4343","index":2405764},"confirm_microblock_identifier":{"hash":"0x45541311506eb64758cf1147600f36b58879fea4d8931d13fca63f96d77b174c","index":3},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":463,"stacks_block_hash":"0xe26129d99c67d4749ea814eaa1e503c7568730963e7b26594f18f3827482b79a"},"parent_block_identifier":{"hash":"0xe5932b52cb06a0b0290c1c9a81772c6b53247fc6542d1335cc53d760eed7a235","index":84522},"timestamp":1668146577,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x2d5f)","execution_cost":{"read_count":16,"read_length":43986,"runtime":166918,"write_count":2,"write_length":153},"fee":3000,"kind":{"data":{"args":["0x627463","0x2d5f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400e5e82753dcec32347028d23e32bdac52080dc8f500000000000000020000000000000bb800004f592a1cb32e25a2b18b681fb40c7e89b94bfb9c66d1fdc1b84d93a75fc23d3a7f5cc298aae85493027515a3c161699b467b58aef0c48962fecc1bade6ec875d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000022d5f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066104686173680200000000086d657461646174610c00000004046e616d6502000000022d5f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae5e82753dcec32347028d23e32bdac52080dc8f5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3JYG9TKVKP34D3G5393WCNXNH90G3E8YP1K09XZ","success":true},"operations":[],"transaction_identifier":{"hash":"0xc519ed381cf48c4597af0f613e325de1638cdaceefe9879bac8d5b6ab2051a8b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc21ebbd2bda5bee13973993125e994dd6f088630edbbe9bebe5d0a70a6246e94","index":84524},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001765b91b5dd35ad67a6fb6c3dec4b525ee4159d645f2d2ba7","index":2405765},"confirm_microblock_identifier":{"hash":"0x54fd36914b372f2097e474459e91c473041c97be79ca93ad2564033b83863172","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":464,"stacks_block_hash":"0xd8769b406b6b98fbbb68b9226a64da2358d7d4b891c093270e79ffad376a6d04"},"parent_block_identifier":{"hash":"0x53c7e3eb4ab18f36b3af742fe2fc1beea372608c28019bce92906eef5190b30d","index":84523},"timestamp":1668149773,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x31327731326531656173642d6473762d7364762d7364762d732d2d2d612d64612d2d5f7364665f5f7673646d7a6d785f)","execution_cost":{"read_count":16,"read_length":44124,"runtime":168712,"write_count":2,"write_length":199},"fee":3000,"kind":{"data":{"args":["0x627463","0x31327731326531656173642d6473762d7364762d7364762d732d2d2d612d64612d2d5f7364665f5f7673646d7a6d785f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400cff965b6b4553644f65ae11651fbf743f3153c1b00000000000000020000000000000bb800018fe66b50ce6b81b7202729133cb4c518686fa70884563c7212a520e7df2b1bca7e2e3a07705829035c81cf0c7830618377897ca4f72b4c10b89f4562963759e4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000003031327731326531656173642d6473762d7364762d7364762d732d2d2d612d64612d2d5f7364665f5f7673646d7a6d785f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066404686173680200000000086d657461646174610c00000004046e616d65020000003031327731326531656173642d6473762d7364762d7364762d732d2d2d612d64612d2d5f7364665f5f7673646d7a6d785f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051acff965b6b4553644f65ae11651fbf743f3153c1b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST37ZJSDPPHAKCH7PBBGHCMFVYX1Z659W3CY0426D","success":true},"operations":[],"transaction_identifier":{"hash":"0xbfa510c401c8b99617b1a53a322a8127e81c8da70b7501daac43f9417e524587"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617463)","execution_cost":{"read_count":16,"read_length":43989,"runtime":166957,"write_count":2,"write_length":154},"fee":3000,"kind":{"data":{"args":["0x627463","0x617463"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400e14cac7d41bd3c6e0a823ae48274f018c9693ef9000000000000000c0000000000000bb80001325952275db34eafeb6ea2423cb04f6bbb030608123429a41fef138b64b102d43e918f06517e66f8e6622a855c7ba05839f7d5845266afcf1c1925c6b55c4adb030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000003617463","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066504686173680200000000086d657461646174610c00000004046e616d650200000003617463096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae14cac7d41bd3c6e0a823ae48274f018c9693ef9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GMSB3X86YKRVGAG8XE90KMY0CCJT9YZ723KYKA","success":true},"operations":[],"transaction_identifier":{"hash":"0xc8c84865f87ade95f5cfbafc575e38dc5b356744dff4059d20f27608ac2de54a"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x31323331323331323331)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x31323331323331323331"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400dc228d23098159e62ef42d1261838ab1af15a6df000000000000000f0000000000000bb800004c10166dce85daf872e2bd394d2d2ce1e09106dc99f4f3fad44dc296bc96ba4573943f57a0b9e53ce770efa3d283c249460ba08f4435353ae2bac967e6e28f75030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a31323331323331323331","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066604686173680200000000086d657461646174610c00000004046e616d65020000000a31323331323331323331096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adc228d23098159e62ef42d1261838ab1af15a6df","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3E25393160NKSHEYGPH4RC3HARTY5D6VWN1TS64","success":true},"operations":[],"transaction_identifier":{"hash":"0xc06636dc6aa07d3634a708584feb919a9336cf2610a65381d301d6632517b642"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xef6161a5240916c78954dad036464319bff8db89b8f74a9baf653ac9487cdce1","index":84527},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000378e61b7e6bef53784d414d3bd457bc4fcc243ea37f2eb6c83b2d158","index":2405768},"confirm_microblock_identifier":{"hash":"0xc2409d5f1fda06fc576e20cab40d9e097cb2805d362499425e7c6146d90292a6","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":467,"stacks_block_hash":"0xdd1d2438dbb3ffb326bdea9813bd79ca10ebf5de2c31ed733c1e4c0a551eb4cd"},"parent_block_identifier":{"hash":"0xc9d1a586a44ff7ddcd5fa95bfcb3174b71e0752bea7b4d92b41c05616d606586","index":84526},"timestamp":1668153199,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x33343577646677)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x33343577646677"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400e9ee5be86ec9e38e491aef3993dc1c248d2bf7ba00000000000000170000000000000bb800002408274a12fe0d2894372a6707876b4b89754597c5a0c886cb1b62934f7902a551171192632736c40bd0d9c56eb41a832bf7f6d58d6c9bd6b0d31d75ad004fc0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000733343577646677","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066704686173680200000000086d657461646174610c00000004046e616d65020000000733343577646677096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae9ee5be86ec9e38e491aef3993dc1c248d2bf7ba","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3MYWPZ8DV4Y73J93BQKK4YW3GJ8TAZQQAFSRYNS","success":true},"operations":[],"transaction_identifier":{"hash":"0x36b51104d8462d614a668458e59f5920937f6e8a27251292c16e3feebf0b0c19"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbbe3f133216eafb16354abe8aef74e11ae5970ae7cda360471972129d681ee38","index":84545},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000006d80948a907ff13f7de40479d99e8f1ce4bb8e162ba39d55933c","index":2405791},"confirm_microblock_identifier":{"hash":"0xeb187dcf208415810107bebda4c0ca86e30caa26a8aaf8cd9ac011109ad5b734","index":5},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":490,"stacks_block_hash":"0xaf5e920a208fabb48390735c36ce33df7d7561fef05a1b0f93a4a22d4684f594"},"parent_block_identifier":{"hash":"0x9392677329e48891cb760889508764e488cb73eab3b499817e3bdafa9dbf8e48","index":84544},"timestamp":1668168520,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c69686c69683938)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c69686c69683938"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400dc228d23098159e62ef42d1261838ab1af15a6df00000000000000110000000000000bb80001a0d9843b6c6d3851d9ad66c781ee2cd15a7024fde0679c70f6255fdd8c3b983c6307c02aafb68fddcb249479f6af169d9f6024071b9afda2ea335f967fbe14b5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086c69686c69683938","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000066d04686173680200000000086d657461646174610c00000004046e616d6502000000086c69686c69683938096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051adc228d23098159e62ef42d1261838ab1af15a6df","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3E25393160NKSHEYGPH4RC3HARTY5D6VWN1TS64","success":true},"operations":[],"transaction_identifier":{"hash":"0x75f3b7f736cc74bb63b27ce6bc6ffed873fa263ea28122c49c88bf8ac8a6130e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3c180e7f2b3881fd15f927bc66a0ed9634977f226904c510e45de2fad68746de","index":84576},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000014c044477fa2d7a18cf7d8a124dfd0921b8802839bce972fe2","index":2405830},"confirm_microblock_identifier":{"hash":"0x2c63cfc3eec282a38bb8687bcf16557a2c311046e0eb3ed735ca8348c084a0c8","index":0},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":529,"stacks_block_hash":"0x25d60e3061d133c429966ceddbf2c9c79d96fd40610dc6fc8e88a52f5ff938af"},"parent_block_identifier":{"hash":"0xb12ce56bb811eb16c0e9e269224f93cbd4f4cc35fee1e3ac5da65207a197be1c","index":84575},"timestamp":1668189026,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x75757575757575)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":75000,"kind":{"data":{"args":["0x627463","0x75757575757575"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400102c4f4e99ca94d32538dad1ef46b7f43a814276000000000000000200000000000124f80001eabfa616cd89195e5aebb333720b7676f16803ef22f9ea975ab1cc0c8cffaaf14b4dd94e8cd4a98b6c2dbeea8555ebc2e96ba827bfed3b65698b867949d85b9a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000775757575757575","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067104686173680200000000086d657461646174610c00000004046e616d65020000000775757575757575096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a102c4f4e99ca94d32538dad1ef46b7f43a814276","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST82RKTEK7599MS573DD3VT6PZT3N0A2ESB6KQG2","success":true},"operations":[],"transaction_identifier":{"hash":"0x79aca5c37f634ceb130f767dedaa54369b28ec7b81ce8079725348e464ea4699"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdb8e5c7879fcec78d9e8d107c9c3f3e83e6e08fd8e11c8311815e1b56c5b4047","index":84577},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001295c0715afdc373c797f722e86683ea24cf8b7853723242f3","index":2405831},"confirm_microblock_identifier":{"hash":"0x517c0fe128c3862c89b24d6d0ef961d92303bffa68eb5082d423f95802a4a2da","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":530,"stacks_block_hash":"0x1a261f294584c38e640e8e7f01c6093c94e20a13e4fd68f8ffbc83790c426312"},"parent_block_identifier":{"hash":"0x3c180e7f2b3881fd15f927bc66a0ed9634977f226904c510e45de2fad68746de","index":84576},"timestamp":1668189932,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f6e766f79)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":375000,"kind":{"data":{"args":["0x627463","0x636f6e766f79"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400f26c45abbf6802c224d8489b3a44c84169d93ee60000000000000002000000000005b8d800003f6c54c160e83edad8e983897558710d731b00bff896fac113f418874042b8305c251344b79d7f973a93210cd46a64c994dd6a899a24619d1cbc637042cd81d4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006636f6e766f79","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067204686173680200000000086d657461646174610c00000004046e616d650200000006636f6e766f79096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26c45abbf6802c224d8489b3a44c84169d93ee6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6RHDBQXM05GH4V149PEJ4S10PKP9YWTCVVJDP","success":true},"operations":[],"transaction_identifier":{"hash":"0x4efb707ae3643a986546ced23034877c6862dd31865f0232571007d1420a97cf"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x27f8084a59f7568808d34d82d0f3263ab3c26bb501565556520e25dee8b475d5","index":84902},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002983f8837c825e97b012ca971521c88488f1ce946a04974983","index":2406209},"confirm_microblock_identifier":{"hash":"0x027bb2d8ca996168a7ad5273f7117be4fe3b55faadf7c4b6cd461d6d2f9f0941","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":908,"stacks_block_hash":"0xadb2ccef32bb8884beb4e83960a15fee69bb51ab8ffd3e5f5cff6f969ea6a963"},"parent_block_identifier":{"hash":"0x4e91f408d3a87af43e26384411dfd11fedb6990e6863b24d63f7cd548e178036","index":84901},"timestamp":1668410067,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737572666572)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x737572666572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400cf170cceaa11f1a9ea0766260a4bbf36385631a600000000000000040000000000003a98000184b1425ad746d9771ebcfef79bfac5d86b4d905e4e3690e4b84f808e53cfe2f25017a624489848366fbe40a537c4dff572ad6c91badc3c660606cc265bc68605010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006737572666572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067704686173680200000000086d657461646174610c00000004046e616d650200000006737572666572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051acf170cceaa11f1a9ea0766260a4bbf36385631a6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST37HE36EN88Z3AFA0XK2C2JBQWV3GNHHMRKD5W46","success":true},"operations":[],"transaction_identifier":{"hash":"0xa4861908aedc784c50bf59938b4d4ac3d376ebf09551926433a66dc6b23774af"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5ac788c6787dabd0195e308f972f3f0d4532ee5cdd2b9205db4a2b10c9008b17","index":84903},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000082f9280afa6c0b939c530110870dc6e0cfb9bfe1549fc724ccef","index":2406210},"confirm_microblock_identifier":{"hash":"0x49f01d922eab92654ccc922ff0b11832ade2b7dadcd3e5f92e4149f389624d36","index":2},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":909,"stacks_block_hash":"0x5c9f069bb865738637d7c1598bfcf355f896da1ab10c6dd0c8b6b6b55fd851b7"},"parent_block_identifier":{"hash":"0x27f8084a59f7568808d34d82d0f3263ab3c26bb501565556520e25dee8b475d5","index":84902},"timestamp":1668411051,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x737572666572)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":375000,"kind":{"data":{"args":["0x627463","0x737572666572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400cf170cceaa11f1a9ea0766260a4bbf36385631a60000000000000005000000000005b8d80000f7a2a86f49e2db22313347f507629d0ab67ace9b1bb2a4dee135556928c7d84a7182f92c7c99205aa37959ca3c6a6f48d7f42874e077225717e20b92aa9eca8c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006737572666572","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST37HE36EN88Z3AFA0XK2C2JBQWV3GNHHMRKD5W46","success":false},"operations":[],"transaction_identifier":{"hash":"0x0677b576f6c54a778660a169ff2863bd4d2527fc07bf0469b715903c1414555f"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a7a7a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":300000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c000000000000000200000000000493e00001043d30fe074d66ec8691b4fc2832b1877d353328a3ee98d7ccb3aac1f16d7cda59cb377323c51eb3e58d3e4db1611b78cab535160946f0f0d49bc09f5362dcd1010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077a7a7a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067804686173680200000000086d657461646174610c00000004046e616d6502000000077a7a7a7a7a7a7a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9460fab3ec3b8f4d1f962b15e6bf97835ec6798c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":true},"operations":[],"transaction_identifier":{"hash":"0xa7a10c31b272258c9b5c933681f92e5059a406d5facb854109bb7baa3d77a031"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a7a7a)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c00000000000000030000000000003a980000c2c6e0f02bdc98eb190fe98bccb0195b452984348d1b2e6eac684d5a4e97ca5f7e9f349a94f645a02bb11d153176af6dbc4b870b7754e0c97e03449bed74724e010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077a7a7a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":false},"operations":[],"transaction_identifier":{"hash":"0x1aee68ce4b1c95464ad2cf784cde6eddd0d062f2af72ede2d52602722b8c5710"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a7a7a)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":30000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c0000000000000004000000000000753000009cab927089e24702a46138985b3459486d0a89a43d07bdd1fcdae9bdf7bd338a172b04db93b99cb7157ad1bec13f1cdf5b3814a7ee63c01e9386c4b81d1e30bb010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077a7a7a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":false},"operations":[],"transaction_identifier":{"hash":"0xdb5a08e38b4ea3357e8d75292f0f5614766a280f6c47cba2255d75868a858ba6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xaf75d8fc6fd14c7ddc0593d98b7173ea435baf52ca3b7612fa2ca29b5d2454a6","index":84904},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000007e45f2290f20e26ac72049c2ea4922ebbe3895382da5774ef64","index":2406211},"confirm_microblock_identifier":{"hash":"0x1c90a33fe0cd04e8abf931d1c55208b2c7b585aa426475b25e977a8d09a7889b","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":910,"stacks_block_hash":"0x35d180e32124a9c6bf657a0aeba2400fd7d69d3b94939c8df6f72899f2dcb261"},"parent_block_identifier":{"hash":"0x5ac788c6787dabd0195e308f972f3f0d4532ee5cdd2b9205db4a2b10c9008b17","index":84903},"timestamp":1668412265,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":75000,"kind":{"data":{"args":["0x627463","0x617364617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002d4c4e9e82588700bfe95094cff35461a888ad44000000000000000200000000000124f80001bff3aa5c4003e844be7cec54b52f5527830974205f6d22af075b9d5e5b09eff01a978a0656b376f64637d79b0b429553fdd61230ca0c9c4f6147d064144dc6c3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617364617364","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067904686173680200000000086d657461646174610c00000004046e616d650200000006617364617364096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2d4c4e9e82588700bfe95094cff35461a888ad44","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STPMRKMYG9C8E05ZX5899KZKAHGTH25D8KTNYYZC","success":true},"operations":[],"transaction_identifier":{"hash":"0x3a10610f0b9b01980aef2095da13afee0959d5fab4b3adbbdb16010ff50cc236"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x617364617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004002d4c4e9e82588700bfe95094cff35461a888ad4400000000000000030000000000003a980000c42006fb80ba8d1b851fd540d4361919dd078cc6d33e0799a1d9264e50bf6b4d649b16f085d85019dd708a31fd51fb68dcef3de447f8c768ada6b8a5279625f6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617364617364","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STPMRKMYG9C8E05ZX5899KZKAHGTH25D8KTNYYZC","success":false},"operations":[],"transaction_identifier":{"hash":"0x244e47231eef74657c43237e334fa71f14670c87e17766203c2ea7bcd9c6a698"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7a7a7a7a7a7a)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x7a7a7a7a7a7a7a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c00000000000000050000000000003a980001520e1bfff632d31bf74a2109e0474d1f8e735703f953445b929f9e8f79d374011982f715a040bb7db342f698bda835746899c3fff79b8a2044d5ef876c5e83d5010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077a7a7a7a7a7a7a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":false},"operations":[],"transaction_identifier":{"hash":"0x0d3f85b0ac542fbdf94b49facb902473c7d049bd8b0f5b43109bad481ecde773"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x57ae9573cf48ca58eb933ddb7f504978180748893b19c56da07d77fcb91b4e0e","index":84905},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001fd98806eb36a17f7f6211e287d0c045e4ae15f1f2e48f3057","index":2406212},"confirm_microblock_identifier":{"hash":"0xbd47920dc1bd8766a2dd8804bf87b00da8002fcf5725ea784b7f2fd4dcf5dc01","index":1},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":911,"stacks_block_hash":"0x90502f45ad8fe43da0734721635cdf836c4261ac916d9e3274bb15a0b0585a26"},"parent_block_identifier":{"hash":"0xaf75d8fc6fd14c7ddc0593d98b7173ea435baf52ca3b7612fa2ca29b5d2454a6","index":84904},"timestamp":1668413491,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626f796b61)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":75000,"kind":{"data":{"args":["0x627463","0x626f796b61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a6bf385c515e6deec564b7973875a66b044c083a000000000000000200000000000124f800004b0bced843ceeaa8e7fff20b4f15bc56742dba45dfd31facf371144cd18b4ee44c7f8bb8b788c1e9329a86191955b7153f09ead992b8af1edc23225fe66af7fa010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005626f796b61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000067a04686173680200000000086d657461646174610c00000004046e616d650200000005626f796b61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa6bf385c515e6deec564b7973875a66b044c083a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2KBYE2WA5F6VVP5CJVSEE3NMSNG8K087BZGFQK5","success":true},"operations":[],"transaction_identifier":{"hash":"0xf8671bf488de5b8e5e54e082ebd269eeaacb9bd09aaa47eb7d17da8ea59db2ab"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x617364617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004002d4c4e9e82588700bfe95094cff35461a888ad4400000000000000040000000000003a9800011ceb361a8fef00a19f18a1e190bee93d6440f1444cf28c2a65601c0c047467e66a87dd5d4f5e750f7e9e279edd6ad7453eb40af44b63eb0f9a5271302c1bd691010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617364617364","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STPMRKMYG9C8E05ZX5899KZKAHGTH25D8KTNYYZC","success":false},"operations":[],"transaction_identifier":{"hash":"0x6c3233cad1eaa6073b9bf6aa1c7404a40165526b64c924207ab6fc482bd92c4d"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x617364617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004002d4c4e9e82588700bfe95094cff35461a888ad4400000000000000050000000000003a980001d37919c62d28c9ada3177f8b61dba082a20a1d73cde51a5427e631a26f1001bc3bbc82b26bc82f3a6c909b0ae701f46fb9eb849898c4c3a46d183cfce4a9c15f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617364617364","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STPMRKMYG9C8E05ZX5899KZKAHGTH25D8KTNYYZC","success":false},"operations":[],"transaction_identifier":{"hash":"0x13a07ee899f7e6e8a8d85a315c30057d1b78d3fe9ae9e1b3e273a2b4a972abde"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364)","execution_cost":{"read_count":12,"read_length":43969,"runtime":131808,"write_count":0,"write_length":0},"fee":75000,"kind":{"data":{"args":["0x627463","0x617364617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004002d4c4e9e82588700bfe95094cff35461a888ad44000000000000000600000000000124f800006ffd4e09b1a9597fc260a40bea049d6b254212ecb227b316087093b5dcab501120c123182a2f70881452915cd881466efd7543d9c2414986643032cb0cd661a3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617364617364","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STPMRKMYG9C8E05ZX5899KZKAHGTH25D8KTNYYZC","success":false},"operations":[],"transaction_identifier":{"hash":"0x30f8791756ac3629ef23fdb2899e607a25089f5a53072ba17be5cd6492aeeda2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfd13849783b13b7301ce93f43be21c65d3b9c57330e0b5fffa2488b90031b7bd","index":84926},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003b467f513acc2b348ddb2c4efd825f96648ce3a449636c4002","index":2406236},"confirm_microblock_identifier":{"hash":"0xb00ca0a46598fc11f8a1861bf37709636e5076727c00534e956341af13ee1287","index":4},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":935,"stacks_block_hash":"0xb768d76365877d2235ff0ce7a8a1846b3259de2dbf69698976d7b21ac86bf5c2"},"parent_block_identifier":{"hash":"0xc8454d6d535cbd91ba0ea22f705dd7821349136ccb759ea879261b0ac5b3d63d","index":84925},"timestamp":1668429192,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616161616161616161)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":300000,"kind":{"data":{"args":["0x627463","0x616161616161616161"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db000000000000000900000000000493e000004cdb025727243fc0a44c8db1392b2eedeb56305ab3360f89e4b2a140920706d307c62702d28719147295f18bf069385873b749fa26e72eebf85255c8ef6bc3bf010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009616161616161616161","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000068104686173680200000000086d657461646174610c00000004046e616d650200000009616161616161616161096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63fd7ec23b0085b49757329fa19c299988153db","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":true},"operations":[],"transaction_identifier":{"hash":"0x08e1611df4ffbaa931fc28e856c0cd5368b15c3c2e7e37f2501a09a201f33532"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x54ed15653066be8f10a946690ea25923adc1b49d7739a0d024b759b1f63f37be","index":84929},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000358f14062200c87f592cdd72797ae803da2a54ad3f3ada0462","index":2406240},"confirm_microblock_identifier":{"hash":"0xc8dbe92660ed137c796617f79e00c7d688bd5de8693de27316e7b2900b7d1503","index":5},"pox_cycle_index":386,"pox_cycle_length":1050,"pox_cycle_position":939,"stacks_block_hash":"0x5645198d56e178e3a409b72ad646510ab8658e632ed2e98be3a98ca086f79193"},"parent_block_identifier":{"hash":"0xde7b99fd8b00a3912602fe0620c0a13042a8e4393b4f723a7bee9778f5d266de","index":84928},"timestamp":1668431924,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74776973746572)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":48000000,"kind":{"data":{"args":["0x627463","0x74776973746572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db000000000000000c0000000002dc6c000000a812ce4eed10661045ec8df3a6d95fa1a8eda19d5809cd4668d638f94634112e335bd0c4f8d2ed95e1f62cd9023d291d18e6b63b2ac5914db1bbdffccf5930f8010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774776973746572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000068904686173680200000000086d657461646174610c00000004046e616d65020000000774776973746572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63fd7ec23b0085b49757329fa19c299988153db","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":true},"operations":[],"transaction_identifier":{"hash":"0xa53482b9f7515435ff42f1a0f06bb79743dce77d2dca36d69c7e89c1a7bab641"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x24a25dab65838d27d1c2e4d40a324f4ed24a55dcb6c121840e67e434a4d6e888","index":85033},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000131e45cb56b7fbf3f2e168fb3be9bb9b477a180145e0f1a5fe","index":2406355},"confirm_microblock_identifier":{"hash":"0x201dd4b727bfe6959e80bb320aa893a56939f0bd5c3437dd928c100c4e974da3","index":0},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":4,"stacks_block_hash":"0xd21dd065c5d19a7c85a36062ed0f87be4449b0830c24fa15c158c10fb21efdea"},"parent_block_identifier":{"hash":"0xb266fc01944799bdf65fda5f8a311584e6d2715ea37e3e09e042430cc83b5b7f","index":85032},"timestamp":1668488407,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6d6d6d6d6d)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":300000,"kind":{"data":{"args":["0x627463","0x6d6d6d6d6d6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400f26c45abbf6802c224d8489b3a44c84169d93ee6000000000000000300000000000493e000008c3c246304eec1cbf7cdad0b21cd114f94c17eca4a1212892e7ec56e709bb84f06ca672ee6295d4778c7ba906f6aeab56a1816ea4839966846a9edf83b9f7f7f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066d6d6d6d6d6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000068c04686173680200000000086d657461646174610c00000004046e616d6502000000066d6d6d6d6d6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26c45abbf6802c224d8489b3a44c84169d93ee6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6RHDBQXM05GH4V149PEJ4S10PKP9YWTCVVJDP","success":true},"operations":[],"transaction_identifier":{"hash":"0xb741a7005efd4384cf29c60103483a3f9836cc0bd4bbc94cb2c7f4d9954ffcaa"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xafecc297de7427739a970bea72caee298265cc8603abeac2c658eb94f9441ad4","index":85038},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000006e4f6c3f6b44d61bea4faa910b72d084e097dbfb712383801","index":2406360},"confirm_microblock_identifier":{"hash":"0x0aa675b4ffc19a0dc66d75a854c542e40a9c052477dc8a0ea012d67a8a18ee5c","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":9,"stacks_block_hash":"0xfe3f070dc1851337e8d33c78925b07539c7fc1271382d81467875d02bb34b9c0"},"parent_block_identifier":{"hash":"0x3b06ff3fbf6735391ef7c9d7c7e37f1f5c2069a813d9fc4c4928d7a6f2435b58","index":85037},"timestamp":1668491118,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f6b6b6f6b6b6f6b)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":375000,"kind":{"data":{"args":["0x627463","0x6f6b6b6f6b6b6f6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400f26c45abbf6802c224d8489b3a44c84169d93ee60000000000000006000000000005b8d8000099deda41d0184677ee2a6b6807064b2fcaa6f907977dbd8c0e23a10749650142669e6e3dc981b7861cff87f942ef61d6024e15ee6369e75a2f4278d27905430c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086f6b6b6f6b6b6f6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000068f04686173680200000000086d657461646174610c00000004046e616d6502000000086f6b6b6f6b6b6f6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26c45abbf6802c224d8489b3a44c84169d93ee6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6RHDBQXM05GH4V149PEJ4S10PKP9YWTCVVJDP","success":true},"operations":[],"transaction_identifier":{"hash":"0xaa75b11bbff32601244a908d628d29179fb5ae1973cd950bc6c8d4da4e0dadda"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x918de8df6492c1c12313fd1cec7f603a39daef429928faa0d0b5c9041dd40cb1","index":85047},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000129ecf9072029575ecdfd62aa9dc8b2d0415155ab9b4c3aae7","index":2406371},"confirm_microblock_identifier":{"hash":"0xc37521ed1612a39ae8815447baa35aa563c01cc5b0527fc14cfdd5e39a7b0adf","index":0},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":20,"stacks_block_hash":"0x210ca3ffb6c3b36ae81af68cd194077c9671f6f2f3c077e34e569c6ae23e373c"},"parent_block_identifier":{"hash":"0xc80d7aaa03e83485d54da969a437a1268fdce024276c2b48f5ba9df7668b532d","index":85046},"timestamp":1668496878,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74726574726572)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":15000,"kind":{"data":{"args":["0x627463","0x74726574726572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400102c4f4e99ca94d32538dad1ef46b7f43a81427600000000000000040000000000003a980001c0a1767276e0981c775e08e66af1888720d92e4c29816f311a4ecc6ed4b9228d34a6927da737c3b1aaaa7c67d0ad8e43882fa99d290b5805e1734bf15726683d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774726574726572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000069604686173680200000000086d657461646174610c00000004046e616d65020000000774726574726572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a102c4f4e99ca94d32538dad1ef46b7f43a814276","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST82RKTEK7599MS573DD3VT6PZT3N0A2ESB6KQG2","success":true},"operations":[],"transaction_identifier":{"hash":"0x1a09a65ffdcb5c07912cf75c874de7d21d3576dcae00e7823e880be6387560ab"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x71959829e4984102b3aba43b27417d1ae277a5e975744a89ebcf16fd51158eb3","index":85048},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001741b6b7fb34e2a489a8f1f0177f3e979140850796bf1676a","index":2406372},"confirm_microblock_identifier":{"hash":"0x9c1ea8231f20fc053d021640cdbab4ad5a589ea712d26fdf9fa43fc906df3682","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":21,"stacks_block_hash":"0x9af560448d662708be4e715484aaf62f37a09ec1e473c381055f718d58497d14"},"parent_block_identifier":{"hash":"0x918de8df6492c1c12313fd1cec7f603a39daef429928faa0d0b5c9041dd40cb1","index":85047},"timestamp":1668497336,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65717561746f72)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":15000,"kind":{"data":{"args":["0x627463","0x65717561746f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400f26c45abbf6802c224d8489b3a44c84169d93ee6000000000000000b0000000000003a980001fc09b6f32170abf4fd00f72c90f80f21f2d4e8d17461d24a87fd7d8ecbbdc35a303e044f617976b42c498a68ac167e6a8b70f13579d5fea80363cccc3a7c880c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000765717561746f72","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000069a04686173680200000000086d657461646174610c00000004046e616d65020000000765717561746f72096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26c45abbf6802c224d8489b3a44c84169d93ee6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6RHDBQXM05GH4V149PEJ4S10PKP9YWTCVVJDP","success":true},"operations":[],"transaction_identifier":{"hash":"0xcbeba35aa6e0a2b2e918ca38a230b537c9229d9d1c10ba967099c2ac970d2f49"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f70657261)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f70657261"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400801cf60dd4b4857634e00c3136391a7c2a10683a00000000000000030000000000000bb8000147296368d9950aa9d9a94667fd67074812831f9e9465c75e3da877054d4dd65f683755916f5bd433a23edee8abfbfb9654977388e7dfc0dfa4af430b8851c31a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056f70657261","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000069b04686173680200000000086d657461646174610c00000004046e616d6502000000056f70657261096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a801cf60dd4b4857634e00c3136391a7c2a10683a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST201SXGDTJT8AXHMW0632DHS39Y2M4387AFT2S3A","success":true},"operations":[],"transaction_identifier":{"hash":"0x7398c9806ebd659ae2fef07c5129ab2a212e9af27780b45a153182750b66c43f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x756b5e9381b9b5ff865ede8fa1914157510d245b4ee8e5ed1a46ac688f780063","index":85095},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000d73a30f0457222c0eeb594825f6eb55474b5e978f3bec3b2ace75365","index":2406422},"confirm_microblock_identifier":{"hash":"0xf22652ef6636606136b039da137ea3edf31dad577ea43729f481645a410f6649","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":71,"stacks_block_hash":"0xc7503a0932198c42af320c96cafc459b5719f30e2f47ec7d12dd9c86487c2432"},"parent_block_identifier":{"hash":"0xc3cfcd815be9c1bec5abb3406acbd89006534cddf40e2c60dcb10ce79445161d","index":85094},"timestamp":1668529142,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x727472747274)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x727472747274"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400102c4f4e99ca94d32538dad1ef46b7f43a81427600000000000000080000000000000bb80001fdb79ee82c0e673975455137108a6a8fb8991fd6de685f603e1bc540a023206c1f6e3433249668bf380632ce37f48f296c6a53da1d42d68f3f08ff7f0f88b40b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006727472747274","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ab04686173680200000000086d657461646174610c00000004046e616d650200000006727472747274096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a102c4f4e99ca94d32538dad1ef46b7f43a814276","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST82RKTEK7599MS573DD3VT6PZT3N0A2ESB6KQG2","success":true},"operations":[],"transaction_identifier":{"hash":"0x795c84668edb14815d8404e9f82dd6b14b2d11447d4505ea5865b473acbbff44"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63686172636f616c)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x63686172636f616c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400f26c45abbf6802c224d8489b3a44c84169d93ee6000000000000000f0000000000000bb80001cecbc4b3eb227d9c159e93c8354ba5ad286029a259d55883f6a743e3a92ecff00f422286dca3781420f653ff8d197c602ef31915afdcd5eb808bdba60d0347a9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000863686172636f616c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ac04686173680200000000086d657461646174610c00000004046e616d65020000000863686172636f616c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26c45abbf6802c224d8489b3a44c84169d93ee6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6RHDBQXM05GH4V149PEJ4S10PKP9YWTCVVJDP","success":true},"operations":[],"transaction_identifier":{"hash":"0x4024c4ec76f059f0517f759be5ebff4737ac14236b6293d47b94e7da1523b2bc"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616c69656e)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x616c69656e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000030000000000000bb80001f9f37647ca17938427e0f43cf3f8edaf878fba0f4465a24c371b1f572a7e704b39897db55499a514feb8ee39b0632729f817aa8dc9e132505acfad24460684fd010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005616c69656e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ad04686173680200000000086d657461646174610c00000004046e616d650200000005616c69656e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0xf6c1e211c172d01c63bcb731359c6ffda2aa045ccad0903f9d187cc48f540369"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6368726f6d65)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6368726f6d65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d300000000000000030000000000000bb80001f65f6df52c2eb10744de39c6d18febe1b2d981681dd6b99ae79b83dba7590ad42fa788d6ec6b587902507d08c04ce1a1d94e3082aacf4a0dc96b56898a4d1ed9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066368726f6d65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ae04686173680200000000086d657461646174610c00000004046e616d6502000000066368726f6d65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x1eaf80b519cf0a351d8c0d9c97b66a0806a8d3e98bf0f39cf292c267ac22464e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3e788894a97449ce5fa0df2e59b9bfd60b23c5326eea68eb97fd449533ff3e07","index":85096},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000701b4592c16c14327ade05ba837224b927c1cd6e704a49a7d","index":2406423},"confirm_microblock_identifier":{"hash":"0xb3a71df1e6b5d235007b70b4847d8dd8edfaeda2b277903cc409f2f0546133fe","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":72,"stacks_block_hash":"0x242bfa0da1a32d4b94b60468611d5a468433679c8bd18920dcfbca6c3d5ebe87"},"parent_block_identifier":{"hash":"0x756b5e9381b9b5ff865ede8fa1914157510d245b4ee8e5ed1a46ac688f780063","index":85095},"timestamp":1668530344,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73647673647661736476)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x73647673647661736476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d63fd7ec23b0085b49757329fa19c299988153db00000000000000110000000000000bb80000dc716d0a50467d23338e8818444792e783940a71c38457a7c9c90d2bd669369d3dd96c7a4ecd1e45fd3f22912b4a0ce8ce57604f8a4da97e28671c74596cd8c1010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a73647673647661736476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006b004686173680200000000086d657461646174610c00000004046e616d65020000000a73647673647661736476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad63fd7ec23b0085b49757329fa19c299988153db","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B3ZNZC4ER0GPT9ENSJKYGSRACSH0AKVCD515Q5","success":true},"operations":[],"transaction_identifier":{"hash":"0xe14964ea17e0bf57647cb47276192dbb86240d6c606288fb5661e0197113aa52"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x77c309168f511d84c56a5c3f98492594d5299b6b53f2049e9b49f1f52a1b97fd","index":85098},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000014ce0e497c0e266b184301afba98f74b92de39801daf45190f","index":2406425},"confirm_microblock_identifier":{"hash":"0x242fa3dffa4ba09d045198d3362f8ef1072d40cde44772685fc97b9163bd59f4","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":74,"stacks_block_hash":"0x06fd6641160b4559ccc5261284abbf66988ff8fa915774925ec4e7071cf99709"},"parent_block_identifier":{"hash":"0x3c9b5f970bd4aed0d6111058e2a467fa963af1ec0322898ce43d01c7bb76dc6c","index":85097},"timestamp":1668531058,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617364617364616473)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x617364617364616473"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c400000000000000020000000000000bb80001fafc28f49cad31d3e66bcaf91b9f82e7289f5dd61c0d87892d1fe567dc3e5a95400bdf2eaed0caba45441d9e0a3d8fab61ab9a0d0de3aecb47591be9a1184e55010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009617364617364616473","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006b304686173680200000000086d657461646174610c00000004046e616d650200000009617364617364616473096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x111b5a233aba6a49088b3705e2ed2250458ad60e272e08f4eb8b968e39b78c20"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfd9c65cfd8762938b28002768231a8f792438081a2d64e0e842a09dd589378a4","index":85099},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000cc5ada54fcf1b89180d527206fc92f079fbb05bc9b42fd1a2","index":2406426},"confirm_microblock_identifier":{"hash":"0x6d60323fdb752ae06ac896fcdd7199439ee5e0a5e118cdc2dd7bcb38470db5db","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":75,"stacks_block_hash":"0xa5d74861fb9aa20be9ea99afe54a94bc8fff76ab6e248e03c94dfbeadf1e7bb0"},"parent_block_identifier":{"hash":"0x77c309168f511d84c56a5c3f98492594d5299b6b53f2049e9b49f1f52a1b97fd","index":85098},"timestamp":1668531249,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e65776e6577)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e65776e6577"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040090a0c8a69c98cc0e7f4109a27d61dcb18e35e55c00000000000000060000000000000bb80001ba3f4f56aa2d0be7d49547ed55e250bc8bea25953ec732d16b3a3a005ed522202deb2b3b9e8e076cbb76cb0406630bd6c78543b8eab5b911d8f73f266115ee4d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066e65776e6577","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006b404686173680200000000086d657461646174610c00000004046e616d6502000000066e65776e6577096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a90a0c8a69c98cc0e7f4109a27d61dcb18e35e55c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST28A1J56KJCCR3KZ844T4ZB1VJRRWDF5BJMDN2ZY","success":true},"operations":[],"transaction_identifier":{"hash":"0x3367e1c74f44c03cd2d8b1b96e61666e71e98bf15d111840826776ff7cc72170"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1736797debabcb35a8d0f84743802d9c0ec2968d76adc1a7a1be32298e686998","index":85102},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003d713ec9996c2ae4141071299dfc9e55cd40f5b660b14fedf8","index":2406429},"confirm_microblock_identifier":{"hash":"0x06ac582a44a68378e7453d5fc88e4e22d228b0d414c9d73b7ef0d315041ed949","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":78,"stacks_block_hash":"0xf2761a39a1ab789f739b6067e60fcaaa1df41fdd3e5e56bfde05a6ca917d1e21"},"parent_block_identifier":{"hash":"0x09649df3371bb77c170f47363829f0b66c4f67aa5bac9e034e4cbcc34f07b965","index":85101},"timestamp":1668531769,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a78637a7863)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x7a78637a7863"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400cf170cceaa11f1a9ea0766260a4bbf36385631a600000000000000080000000000000bb8000033d7dbc0cd48c18618eda937b8b30eff4070348f8b3b43131c157184dbdb0dcc183c1cab2841c2c04c77d4d202328311964c5fa120d5f4f60c109304f6505f1b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000067a78637a7863","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006b604686173680200000000086d657461646174610c00000004046e616d6502000000067a78637a7863096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051acf170cceaa11f1a9ea0766260a4bbf36385631a6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST37HE36EN88Z3AFA0XK2C2JBQWV3GNHHMRKD5W46","success":true},"operations":[],"transaction_identifier":{"hash":"0x886dd3041a79dc56573f0758000931f7362971b99cc41d0debf99538b557ab20"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3e061abc9e5dd4c3e791ff783abb4d672469a6bb566008ba9804a77072337338","index":85104},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001f9bb1f90fe24ee1e2633a723a9e03f712604fde3267a5aff6","index":2406431},"confirm_microblock_identifier":{"hash":"0x02f3129cbf51918a1666c9815f5e780bbbe715df9b745cb0b9b7a711ffc2180e","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":80,"stacks_block_hash":"0xad21685a6f445887d599e9c390da307aa1814fe1cffa8808d99cea785f10c6c6"},"parent_block_identifier":{"hash":"0xe062c794fb0ebf2c2ae5a6ef6801266582584a9a65d6ab9149ceb5509527832e","index":85103},"timestamp":1668532456,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616c6b73646e616b6c736e64)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x616c6b73646e616b6c736e64"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002bab36c23d196770d96b35bfc67e1875fb85276d00000000000000030000000000000bb80000b5790521f9d450e286c774f7763c8369c1b4c29b7c4524e6ea5928edc06545ad5892ac8640bb77d69b311fd32b8afac859f9242a0413c0ef5ee60adb4d8ce1cb010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c616c6b73646e616b6c736e64","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006b904686173680200000000086d657461646174610c00000004046e616d65020000000c616c6b73646e616b6c736e64096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2bab36c23d196770d96b35bfc67e1875fb85276d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STNTPDP27MCPEW6SDCTVZHKY31TZQ197DPB6QT5H","success":true},"operations":[],"transaction_identifier":{"hash":"0x98007b1273701383089d1d9be9d000b53407b12f8147b1f7d81b745e7665b535"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2ee94c9f28464e87993649086836bcda8bb7f49da374e423b91939bcfdb2eb81","index":85110},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000020aebe0ec5faba5a7fe49d11b44325f8018816b6e5bf7b12f8","index":2406437},"confirm_microblock_identifier":{"hash":"0x33fa610e2a00d9587c0847d8aad3373c4852dda0c661e1c5037897bc2d4a2b6c","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":86,"stacks_block_hash":"0xa84aa86ee80cc1c002445b3e3aa646ef2792476ddadd78562b2469e5a8458e29"},"parent_block_identifier":{"hash":"0xdc693eb58257c5bba34ce048e00d61cb19ff5463efe9ea80ba8f8463200c72a8","index":85109},"timestamp":1668536337,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6d6c6b6d)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":24000,"kind":{"data":{"args":["0x627463","0x6c6b6d6c6b6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000020000000000005dc000004e282ab862955abce5325bf3a6455bb5ceb6166681d7b7aaa1ace8efb00d5f19400166aaffee64b9c94aaf09063cb49231d3d29ec19bab6f2b56a25c0c80e857010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066c6b6d6c6b6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006bb04686173680200000000086d657461646174610c00000004046e616d6502000000066c6b6d6c6b6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x2e3509c591badc21baf6faa99e3ed42814cd2babb37e680d83384b03400a55d8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xddeb182f5aed9db56272518d0db49768fb979156b7e7d04ce599c3c08c03d3df","index":85117},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003a63979a6b9cf45d9f09a72e2a319246c59991d95afb1b02a0","index":2406447},"confirm_microblock_identifier":{"hash":"0x157b08227e3115ce6558723e674113da54dfeff5d79610bcbec179842a8965f2","index":5},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":96,"stacks_block_hash":"0x0133001e2aca8fc24f60516ba043073069bf915ee848c25653e53ed3f1a171e2"},"parent_block_identifier":{"hash":"0x26b6117e13ccdcf975977188cc476f11615162bfd5b08982fce8c8b05a3e53f9","index":85116},"timestamp":1668541376,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6b6b6b6b6b6b)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6b6b6b6b6b6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400801cf60dd4b4857634e00c3136391a7c2a10683a00000000000000050000000000000bb800013fedc1296254ef32c5aca86911e8de2d804f2690c7d743997bdc3df230ddebce6e519388d18df594a2aaedf7d58b7cb26379fa09204e8dc2fbf1226e5afacf7d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076b6b6b6b6b6b6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006be04686173680200000000086d657461646174610c00000004046e616d6502000000076b6b6b6b6b6b6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a801cf60dd4b4857634e00c3136391a7c2a10683a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST201SXGDTJT8AXHMW0632DHS39Y2M4387AFT2S3A","success":true},"operations":[],"transaction_identifier":{"hash":"0xa79941fde8877b5b638a3efcc56bba22d18020e45bd81d49f1411131bc35d3dc"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b736c666a7676)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b736c666a7676"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400c59ee6ff16df50b45f7888a159b22835ac6db98f00000000000000030000000000000bb800008d5e1439dd5ed399b81fe93eded4faf997ef99850a0f26c3a8277d4c43a9ab5d10097e877ceb1b0192d276b7b34312473f3fdd7252fe0e55b2fcef056d841e73030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076b736c666a7676","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006bf04686173680200000000086d657461646174610c00000004046e616d6502000000076b736c666a7676096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac59ee6ff16df50b45f7888a159b22835ac6db98f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32SXSQZ2VFN1D2ZF24A2PDJ50TTRVDSHX6W32MG","success":true},"operations":[],"transaction_identifier":{"hash":"0x1d51555dec7282f8c80806e4c017b29cc3c8337d97b5a5140990c22bacb6b8b8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xded02fdac4ae220033544f9d0cf7dbcae9508f894066d0a9dc792fc7662039d0","index":85175},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000044eb884d936b7ab83843fcc770aeee674d2bd62dcc0feb512f","index":2406507},"confirm_microblock_identifier":{"hash":"0x94d84ceeebfb023c02001d88bed94c4de71e3bf26eae15d5f416ed6c4cf98a4d","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":156,"stacks_block_hash":"0x8d7c7bc32258ea67c3f0b30cc8ef11faed372f3d7147f681d0c3f2a8562266b8"},"parent_block_identifier":{"hash":"0x12436a7be3c920df761ce15ba05071d2b8221adcb904710c96447a30c6caef01","index":85174},"timestamp":1668581979,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646a766e6b736a646e76)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x646a766e6b736a646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000050000000000000bb80001b8b4c7ce0ae89e3168b25150f8cf975f39d95dba810fc6689e26f95bd608a4547ba98a12ac52169b32971cd924f629263f2c3cb3c8725e7389f69644b9f7964a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a646a766e6b736a646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006c404686173680200000000086d657461646174610c00000004046e616d65020000000a646a766e6b736a646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0xe5a57238084183789281f31aa6fdea703e1e466869221c0fb256d3c94cc7ec5c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5b9db8bcf08a251eb663a7e543a1e05efafa3c8bf62c8b1bd3b946eb93c4e74c","index":85179},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000004d422c448e699c8d9881715c469bb7295a54495a88adc4bc257cf021","index":2406511},"confirm_microblock_identifier":{"hash":"0x234de097b86dcbcf90738dbc39b89b0ab452d8b2651d21d8ac93ef7aaa8f7169","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":160,"stacks_block_hash":"0x4b730361af4ae4301c1765a9cea56af023419720b434c942b9031bdb6bb8742e"},"parent_block_identifier":{"hash":"0x45a001018949d7a6681a491c893218f41928c861fd4b8768fc2246607d776a4e","index":85178},"timestamp":1668583604,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c73646b6e76736c646a6e76)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c73646b6e76736c646a6e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d932500000000000000030000000000000bb80001be244bfc06f4004dfe41fde0493455e2a82cda178257a559cb8f3d2bfe41a9060297268f620e51a841f46ff5790ffb0843fe2953acee674006a3a86c72798644010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6c73646b6e76736c646a6e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006c604686173680200000000086d657461646174610c00000004046e616d65020000000c6c73646b6e76736c646a6e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x8eabe90362c488af12e2e1310c1dfd3c4baacd0d7c79a52437afff4dc19e880d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9616d56c5766aaabb693527b2ed177b1852387daa849a5dccc74ea1d9cb4beea","index":85181},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000027f5c33c0860f81609d7caac39e6a27c380ab61bf1f7b9250e","index":2406513},"confirm_microblock_identifier":{"hash":"0x63790f8900b4bb717e7e57ae108a3e0150ff0cbbdbe3e7b79c08022fc06e436a","index":0},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":162,"stacks_block_hash":"0xe2def93cd851214c9bc2d86d595b612b3d1b56a1c6466fcf3cd0a9aa10b39e7c"},"parent_block_identifier":{"hash":"0x3158c5a5e7a5866271b85234a10ce504f3d28ef5bc43fb40a6bc670e30b83585","index":85180},"timestamp":1668585349,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f706b70696a6970)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f706b70696a6970"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d300000000000000060000000000000bb80000a4dbfb82549062f8e2e6a746e02e14bdd67b965b9ac73cc9e8d69bd86c2ed2666a713f0204e0be3daeb7be89e3434fa81c9d5c89622a20af215dcd82df6d3a36010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086f706b70696a6970","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006c704686173680200000000086d657461646174610c00000004046e616d6502000000086f706b70696a6970096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xbf9868599234811e8cad21fa882faeb676334f35cabd6446d61a7267ecff5a3f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa8a30e663a781367f1297dbbac36a5f48269b673aa4ee440032d2a238932324e","index":85184},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000053cf0ef6c09866f9b2445baabac184922e68a1c46c67395063cd","index":2406516},"confirm_microblock_identifier":{"hash":"0x77e33eeff603c9826f65597ccd75da50460d3e35022e1131dcfa3ae9c76aeaaf","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":165,"stacks_block_hash":"0x374cc51c9f44063bb71fee31a3465e0da665b7e9273851cd53c62a30e897b4fb"},"parent_block_identifier":{"hash":"0x27d1c5bf33a63f316717334a029ecc9451e905e2e5271443ac8684b2641b596b","index":85183},"timestamp":1668586133,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6569727465716f6867)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6569727465716f6867"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000060000000000000bb80000a5400e13afb1da5e89677d00f1015adb71818566ae57c9ca5c1a904dcde609a7305d769ac526ceaf5d4aa130809b5fea663cda224b1fbe6fb6ad7af9701d0a91010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096569727465716f6867","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006c804686173680200000000086d657461646174610c00000004046e616d6502000000096569727465716f6867096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0x5a687fba82641da354b02de4f0e8e8f5a32f4747eba967a786dceb045f140726"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x43463cd774c6362a4da8d71429ee3a7535ef9d99ec0eb393e51b02daf2d908d7","index":85185},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000006241d3f1ef8e2ef48b977e9a74ff161da308c11959b9f825cc997cab","index":2406517},"confirm_microblock_identifier":{"hash":"0xf43e35afd29b5ad1123e02ab67137146ddf429ccc6d779754e844d36457bf8ff","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":166,"stacks_block_hash":"0x6a7ef873e6dabb8f3f97646b87dd5709eb1ac71c80e2eb19639fd8640e5e5de3"},"parent_block_identifier":{"hash":"0xa8a30e663a781367f1297dbbac36a5f48269b673aa4ee440032d2a238932324e","index":85184},"timestamp":1668587355,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6b6c6e6b6e)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6b6c6e6b6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d932500000000000000060000000000000bb80001241c5b606d72ad25bec52ae8f3a1857816ab70dce1fc05fc0725ab733328c3fc368087057b70f9d3da4b3e5ff814ee4dba85f37833577267a24e59de66cdeeff010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066e6b6c6e6b6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ca04686173680200000000086d657461646174610c00000004046e616d6502000000066e6b6c6e6b6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x6e280e6816f23b6756c41eb0db7257a54e142cb8aef6b409a4f1b49470591040"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xeec682013d9fa67cdbc533a2d22cc131733aabd3d8919be21b0eaae5ffad6511","index":85187},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000350173c5fefe96638f528909216ea8da02fc5bee84af203f90","index":2406520},"confirm_microblock_identifier":{"hash":"0xb97423cb6c49474fc0c24b6af14205b80dceeac3c088eebe849f43e091398111","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":169,"stacks_block_hash":"0x10664bcc2f7fde2780db25d5238d2ba6cd48f86e73c887ec2fde0afebd226a5e"},"parent_block_identifier":{"hash":"0x262fdf7fd46fb604d3a44e1d277c6078a8e6a7e75e8e626041bd6792f24f92bd","index":85186},"timestamp":1668589222,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6e6d6e626d6e62)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d6e6d6e626d6e62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c400000000000000050000000000000bb80000137264f70987095f9a77794ba553a50577f58c09fe4c3e73b8f58aa344f2e33c4b59d3ec6dc50aa61ea2abb3362b96b2778f2174a0100b47fb3295e62018cd31010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086d6e6d6e626d6e62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006cb04686173680200000000086d657461646174610c00000004046e616d6502000000086d6e6d6e626d6e62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x6602bc6c33841a6c3bd9383ba08652a7e71c20907d5954dd1fa90e388f5f430c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4f2948ebe777308aff041d5ac56cd02e32fb6a9a96f451af453abfb824512f58","index":85188},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001ad4bbb4bb1b2ae5ad8b23f9a3732e40588ee8e864b49b2ffc","index":2406521},"confirm_microblock_identifier":{"hash":"0x65a5187fd9aba3814b0b1e7342109cabbc4785062f987ce60221aab78da03784","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":170,"stacks_block_hash":"0xccac104e04f7ed25955a4e35a3624610835b3b2e70521c39b4a996260aebd37f"},"parent_block_identifier":{"hash":"0xeec682013d9fa67cdbc533a2d22cc131733aabd3d8919be21b0eaae5ffad6511","index":85187},"timestamp":1668589888,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6879676d62766b76)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6879676d62766b76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000080000000000000bb8000106afe6e4b16f8ed78054845ef8be57ebbdcc7b15bddc3b923b06b2f6d874a9b96eaa7ff5f8ba5a35bc0933d8187bde6ef14f3336436e31565230c25a856ef5b4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086879676d62766b76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ce04686173680200000000086d657461646174610c00000004046e616d6502000000086879676d62766b76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0xed9835fdbadb863196f477811ad1464883d18bfe2fe5a2312c7e95fd9e53b951"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf72836358e1419f679224ce73b6b47ab93c6b65c3cc494b0a606e6d7eaa8fa81","index":85190},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000449d26a66491da55b07254aafda7a1f22be26016215637f211","index":2406523},"confirm_microblock_identifier":{"hash":"0xf47d86cee728fd9863b0ed64daa773edd2bd5f8f705519315d06686fd2d0894e","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":172,"stacks_block_hash":"0x8166ef35bc1d4154313b93befd9e56aad245c2ce4ca0acbfe5c58c8176f56fad"},"parent_block_identifier":{"hash":"0x4a3d97aa2a2c0c187cf5b70a37180b643ebc3f46ecdc0aa46e379328ef2e64ce","index":85189},"timestamp":1668590257,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b626876676a)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b626876676a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d300000000000000090000000000000bb80001421bf197bc56b7ad721c18ce408f29edc02b9bbfe16f114f05197c00f96f70d4519ae32fac99334e921be7a555e931c935c816eb999c47318255c12d5fdb07fe010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066b626876676a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006cf04686173680200000000086d657461646174610c00000004046e616d6502000000066b626876676a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xf62ee7b335d747ce06dd1f852f329eb8851856cb4069e6097de2eef0d9f464fb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x55cf45ce7623d534dd9b1ba7df6d53c1ab4279a3074a4362210a186709566ae0","index":85192},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000007bc759b288adb78047528ff2ab41bc34de48ab0ea19f2cf516987f7","index":2406525},"confirm_microblock_identifier":{"hash":"0xb1a762ed6dc684bceb92e67b1887b7dc572ae175b812790e6aef5a53c83726c1","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":174,"stacks_block_hash":"0x19d48118f257033b392edf488634f5764cadfcf058133dff74896c73a5b98e64"},"parent_block_identifier":{"hash":"0x16123f0cbcc2e60321ac4cc5f0717373cff3fa3801e23fc8721636193f00cda2","index":85191},"timestamp":1668591311,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636c61696d69)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x636c61696d69"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000090000000000000bb8000048bab052eef2bcc9764941b172556d640c36f36dff24cfbd72ae1b52795dda954d29327c305a8cb98d26bfb3faa674e9f427f91c7b8f305889d0dc22428568de010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006636c61696d69","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006d304686173680200000000086d657461646174610c00000004046e616d650200000006636c61696d69096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0xd7b1c96508ed215c0c609fa6467dadd1f5923812eb93771d1b4bfe20398c29ff"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xce73818bf953acefc5e541bdda43f66a1fdfa92cce3ee8e85cc4105304126cae","index":85194},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000005fe6caa5abe6079f82ad1ab0d727d4ee13d7b590c0aa6949de72","index":2406527},"confirm_microblock_identifier":{"hash":"0x7c6e217aca321423e9b2790a41fd7bf99af22cf05bb8f5186635a3d77b175cba","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":176,"stacks_block_hash":"0xa556f8e9bf2c4066d17375be049139baba23ecb6bdf5b001ccde43694ec3b438"},"parent_block_identifier":{"hash":"0xdfdc5ce38ae4dea3aab09e16b4e328cdf5a669a063c17286b845ce072d758c42","index":85193},"timestamp":1668593729,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364667361646661736466)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x7364667361646661736466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d932500000000000000090000000000000bb800013b37288a629a94a1fb5b3852d391095272f656caa6bf42b978ed5eee5d0c3ac443bdeec0411fea49c54387b01c07a3b7e3db42e83fcdf899462d9a8174968f1b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7364667361646661736466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006d504686173680200000000086d657461646174610c00000004046e616d65020000000b7364667361646661736466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x5197633173bf9e97437f6ec38339ffdd70da3fa5f71f9a781f261598e0ae6985"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x357fb753c564ce79964353a910ae33811ba86993867f337e3ac74221f2a92f4b","index":85196},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000198673890f25c84beb40a331d2d01e8a73921b2d7d6ec81ddb","index":2406529},"confirm_microblock_identifier":{"hash":"0x3a7f66757edc0bb3a1f96d2cdb60d8004d6589338264171c9d1607ffccfb1d07","index":5},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":178,"stacks_block_hash":"0x8f8c80cc89cfa1065354fd102273e4e3c88679d3c879d1ecac41c95f527e6f79"},"parent_block_identifier":{"hash":"0x57a74e77811cd0468a96ea178c9893c38d0567d4d98b0620f589aab5f56b6815","index":85195},"timestamp":1668595113,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73616466617364667361646673616466)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x73616466617364667361646673616466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d3000000000000000c0000000000000bb800005b17ca001e512e4d54e191b06d98095bc514f54bc5a3144b759174d9b1a036bd7afee4d565d06609e12ffecb32812edbe493820dbd47ae0197d29750d14e933d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000001073616466617364667361646673616466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006d604686173680200000000086d657461646174610c00000004046e616d65020000001073616466617364667361646673616466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xc90bc3434b9f746782260291af6206db1235309cb7d1374e0ca7e24b50953634"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf4f80a48e842ff821f3f8022db63452dcae2e418c9e4e927087bc086ebea1a99","index":85197},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000225227d44af752dfa10496e0746c7813782c031593115197dd1f","index":2406531},"confirm_microblock_identifier":{"hash":"0x9a9321131fb9a193c647080037c5aa1d03a5b8487c9832ddf5047f5e06c68342","index":5},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":180,"stacks_block_hash":"0x23ff6c5e7ca485c3cef668346a3b854c10f7c28b7193390451d3fdc8f10e1f08"},"parent_block_identifier":{"hash":"0x357fb753c564ce79964353a910ae33811ba86993867f337e3ac74221f2a92f4b","index":85196},"timestamp":1668595959,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666f7874726f74)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x666f7874726f74"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":139,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e16000000000000008b0000000000000bb80000bcd71899d0382487b6a08faaf80ec4f1f8a76b62ea2e3d37b8a78fda1d9ab99b2e32f220b49b94fac6bac9e014b91db8a837f5dca6fe54e7cef536d33eabb394010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007666f7874726f74","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006d904686173680200000000086d657461646174610c00000004046e616d650200000007666f7874726f74096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0x5dd676f17d7cf2806f9e38644a9edca42c44c5b34a43e4a353915f2342f68d35"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf92642a0b4cf31003d8f91aa3bb011585f8a3064c9d7f29bccd857156421508c","index":85198},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000128a959ac5f399418a0f13d18b9ea236d5d3dcce354ca2149f","index":2406532},"confirm_microblock_identifier":{"hash":"0xdd6b517065fcd93e8cb00782f6b1a724a50594768655e3003d14cee3e5c72ae5","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":181,"stacks_block_hash":"0xbb6919e60913e1f7bdea37b505f70bf78638af1975081b02e33cbdf4bef63392"},"parent_block_identifier":{"hash":"0xf4f80a48e842ff821f3f8022db63452dcae2e418c9e4e927087bc086ebea1a99","index":85197},"timestamp":1668597235,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f6b706f6b)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x706f6b706f6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa38000000000000000b0000000000000bb800000cbe9acde5a4eb65068a0c1c8a8df81c3d83a1ff7e10b575220bf47b44b56fb532ce4d3e27935338342f502a9166bb28f815232958193bd7ad112cf1fb902fc5010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006706f6b706f6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006db04686173680200000000086d657461646174610c00000004046e616d650200000006706f6b706f6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x790f0930325b42d8db811ba94b862e998b2fbc0cdb5e0a4cc6affad30422d1ca"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63787a637a78)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x63787a637a78"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d9325000000000000000c0000000000000bb80001dd6cf9bed92005979eb7fd9c189d3aac1cf187aa038b4e1b91d9df42ffb134eb6eeadaaaf7a453fad070a6b33539a2aeae3215a69f3ca81be715a98d6be15238010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000663787a637a78","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006dc04686173680200000000086d657461646174610c00000004046e616d65020000000663787a637a78096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0xd504c316edb7570bfff085a52cb9966658f872506d3c84e1672072f62baa8fa0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5615d8fd82f77172546674d51506520d36dfb926ac4aec91ad53652787e62576","index":85199},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000a23a89042474924d34f7d80ad095f099e7c84cdb6bfd76f40d74","index":2406533},"confirm_microblock_identifier":{"hash":"0x1cc4e1a9af6452c863cf660e48217eb87fc4d2cf4ef397fff358661818f57ecf","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":182,"stacks_block_hash":"0x799f3517f52ba1b5097f8368e9d358b1ee0daf9dcd0af566f795cc897a05b145"},"parent_block_identifier":{"hash":"0xf92642a0b4cf31003d8f91aa3bb011585f8a3064c9d7f29bccd857156421508c","index":85198},"timestamp":1668597836,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72746572676e69646c)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x72746572676e69646c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004008eebcc7630f669463187bbab6b9896aff3f4893900000000000000020000000000000bb80001e73df6aa1709da84f86e956365f96684da548a9da8f57f95e33fc360899b708d0a27614cc229805be186b3b98d28b40d5ae8abb2b8c670107922cd640e9e3eff010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000972746572676e69646c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006de04686173680200000000086d657461646174610c00000004046e616d65020000000972746572676e69646c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8eebcc7630f669463187bbab6b9896aff3f48939","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27EQK3P63V6JHHHGYXTPTWRJTQZ7X4975MB90ET","success":true},"operations":[],"transaction_identifier":{"hash":"0xd9a83a115713bb65b431a9d34fcff0212919f58fe1a91717b1b1f3eb35e7dd87"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbf8ae71a5c251797a3e83f98bb17d1f3175fc7973d0eaa2883dcb247cf100e18","index":85202},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000071457b3f686cdad9273fb13bde00b2b23ed847213f1b605912304f05","index":2406537},"confirm_microblock_identifier":{"hash":"0x1c335753b99ec37dd82c12db089724d9e7268b92057997b3edbcb30744a8d11d","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":186,"stacks_block_hash":"0x6ea76dc3db288b1a031546719ecfffe6e5cf34311dca152dffcd61c1805932df"},"parent_block_identifier":{"hash":"0x466d1dee8c4aac5120d00c5ea622633d4b9df09fb4c775496c7fc2fcda2cfbf6","index":85201},"timestamp":1668600326,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736a6b64636e73616b6a646e63)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x736a6b64636e73616b6a646e63"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":142,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e16000000000000008e0000000000000bb80000de052e020735829afb3bf1c36b40133cf5472e635829e210f1aa590adf8a07cc277903d3a6e673f7b9edb96461dc1c9d9117df2307e65f4fa3bd1106e3b1b1bb010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d736a6b64636e73616b6a646e63","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006e104686173680200000000086d657461646174610c00000004046e616d65020000000d736a6b64636e73616b6a646e63096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0xee412131d45327b421e8edd0f4f88da4139317975a656bdf9818181cc9ae9888"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0bbef1674da849da1b43d17f47b0340f6a7e5baa1aa2248de93418b07a270ebb","index":85204},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000bf4365bf7c7e54277136279db08f168869d7f02537d6c7404f08","index":2406540},"confirm_microblock_identifier":{"hash":"0xb3581408290e682b554cdef08e818d372e32cf3a24440440b089bd32faee1119","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":189,"stacks_block_hash":"0x2cabea2d284345f40d9325649bdbf2c5ff49677e2c6475050b49398dee9637ed"},"parent_block_identifier":{"hash":"0xd4f56d1a1bd55979f1ad9de8a1c5ae9b9f08d77a984a0cb227386710698b9eea","index":85203},"timestamp":1668601708,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6b6a6e6b6a6e)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6b6a6e6b6a6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c400000000000000080000000000000bb800014a268b3f71cc5848aec18179ca58927b5e97c2d27c4c5d13f408f3789e69739d4bc8393d146ace3921eb2bde59b428dfdff19994f0c2167cbe1d89537f60284d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e6b6a6e6b6a6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006e504686173680200000000086d657461646174610c00000004046e616d6502000000076e6b6a6e6b6a6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x5490cf7b2883a7d3965e2189aa6a1834502ec059d6842ba50bd6a31d2e1c0d61"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b736a646e766b6a73616e64766b6a73)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b736a646e766b6a73616e64766b6a73"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400af56a17f9b87d854f18e579c1787d7358330c96700000000000000020000000000000bb80001be60dee5aa19d95207b63ec74dd0794a49d80e45b442731f54039a6a1a38c6c1472d5a80046d0d0e19ae3217906d3e5e2548a27febdea66a84a36e31c2e72e74010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000106b736a646e766b6a73616e64766b6a73","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006e604686173680200000000086d657461646174610c00000004046e616d6502000000106b736a646e766b6a73616e64766b6a73096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaf56a17f9b87d854f18e579c1787d7358330c967","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QND8BZKE3XGN7HHSBSR5W7TWTR6C69CWAMCGXP","success":true},"operations":[],"transaction_identifier":{"hash":"0xd639489d4535605e8ac9cff62ac38bd2c37ae02927c9914de4b2205fa23915e5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe4bd53989b0e0e9a00a16fd506d5319abff2c122223cee5fc4ec7513ea631ac6","index":85206},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000250918161dee752a7ba2b399df5fcce7d77af7f0f41607189f","index":2406542},"confirm_microblock_identifier":{"hash":"0xb3792973539f67c9fcc81922031fe6bda29dd6584e1d0f190d0187b2c97966a2","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":191,"stacks_block_hash":"0xfbc4ea1753d1e4ca91ebbbd0bc0160b0330e50d61bdab6d091c1ef19d5bc4b29"},"parent_block_identifier":{"hash":"0xc539a0b4b0effcf1f7a1c87b78efc0ece5cf1ec327686eef83255903fb34a60c","index":85205},"timestamp":1668603328,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f6b706b6c6b)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x706f6b706b6c6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d3000000000000000f0000000000000bb8000144e91ac446f5fe41ae5c8a8090fda080fce67b3b031a72e509864ca8fd390ea012f3582219dfd49a2ee804c656bafea9e790ee5e3c40975655792e015fd4472a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007706f6b706b6c6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ea04686173680200000000086d657461646174610c00000004046e616d650200000007706f6b706b6c6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x6a7dd6b69b99740124178b97c632b3f875707d853f9d603b5bb1c791fd9e1e2c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe8ee6c299f66356324b6b5d886c4c606b7bab1c37c8d2688ebb8f2029bc6ed53","index":85208},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002930017f9469d7c2fedc0d699b23f2b27f3458cd43653f9957","index":2406544},"confirm_microblock_identifier":null,"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":193,"stacks_block_hash":"0xb2372d7a9bbdef1032599059fa5115791308c64e3c1298998ba58d3335c9f0cd"},"parent_block_identifier":{"hash":"0xd9a095b661eeb4c87e884cbd6eb16a0380159db94c791ed357ce0d19985f3c1e","index":85207},"timestamp":1668604062,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6d626e6d626d6e62)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6d626e6d626d6e62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa38000000000000000e0000000000000bb8000091ab4c760deebe04eee61a243b5e7489514db98be07cfdf15323c9ebcb6f68c938fa750304e04b23d63cc891067f97d4b7ac4383501d99bc0b2699a886c57f19010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096e6d626e6d626d6e62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006eb04686173680200000000086d657461646174610c00000004046e616d6502000000096e6d626e6d626d6e62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x34af07d09f844a93de77acf209820d9797784ba103296909693f426880e9a363"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4685ed2aea5e0dc4b465235d03d5f1af95eff30fc2f210a163f233467313e223","index":85209},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000007f5ab19f01ae76a4850b621ec40e055fe83aeecb8829330a015b","index":2406545},"confirm_microblock_identifier":{"hash":"0xf2fba15bbcb7a1fec2b01a194bcfdd76eac137e380877290391578981b8561e0","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":194,"stacks_block_hash":"0xce1f6dd3829803fa9dd8ba09056889ff71750bbeacf7ddb90c5a49cab9026e0b"},"parent_block_identifier":{"hash":"0xe8ee6c299f66356324b6b5d886c4c606b7bab1c37c8d2688ebb8f2029bc6ed53","index":85208},"timestamp":1668604155,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736163617363)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x736163617363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d8054000000000000000c0000000000000bb8000006f688d59f75e790ad2f7c040f646b5cd6ebe065fd909cab206dec07efa0668e1bb4396a998f2ec23fc076cc4314651b52c49cfacbf9ee2568aeb1fa1132857e010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006736163617363","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ed04686173680200000000086d657461646174610c00000004046e616d650200000006736163617363096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0xe7fd8b71a003d9ce945fe197ac90909211412daa21ab71a95fca50f60688c673"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6e6c6e6b)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6e6c6e6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004008eebcc7630f669463187bbab6b9896aff3f4893900000000000000050000000000000bb80000a8647ac3a4c810f1125cf790152ccd956856aa4b943634b69fc437633f480b642e7896e1d2aad1f974dec6606dc049640ea0f1af9fbc30f8e071e415f4e9c2d9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066c6b6e6c6e6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ee04686173680200000000086d657461646174610c00000004046e616d6502000000066c6b6e6c6e6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8eebcc7630f669463187bbab6b9896aff3f48939","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27EQK3P63V6JHHHGYXTPTWRJTQZ7X4975MB90ET","success":true},"operations":[],"transaction_identifier":{"hash":"0x2a0a23d2841eef51e7432c892d1507f0b475c4b073a261c1a411b8ae54a51e09"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x21c9299066458df1196be47cf255c2608ea45b1827c2816de986a9b674d4453d","index":85211},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a14439dec04795f99e4ee0f2c9b3f3a2b860a793a8b6a0658","index":2406547},"confirm_microblock_identifier":{"hash":"0x4df0c54848f54c72b1878d28d123425ae3bf11c7feba94cc18e5c5550f55fc9b","index":0},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":196,"stacks_block_hash":"0xbb25596795bcb85d0dc81b7468ad81807e6f5a6e3a40c39d37dba26e70f5609c"},"parent_block_identifier":{"hash":"0x15623ad081863ab972116a822211752fdefad8b0e72129e51f195ff6076a4d3b","index":85210},"timestamp":1668606212,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a79676a62)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a79676a62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d9325000000000000000f0000000000000bb800005268873ba041bde712d898c3651bea0a6c45fb383b584f3b67644389a4043ef805d6701fb8a5e8bfc5ec696db1fb5bc9d65baff2f72f2ecd3e141abe5a671203010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056a79676a62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ef04686173680200000000086d657461646174610c00000004046e616d6502000000056a79676a62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x64e91c00d8c288eabf2831f836b2211bd359f685c7e057cc6b006e1b2987e7fd"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1a406517e8ae4fd0771e30b5dcdbdaffaf8c9c1f0dd9a17c18376d8145441f38","index":85213},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000084bbb9dc1490606c0f043385676b92af6d9eda46c8894869d0a670af","index":2406550},"confirm_microblock_identifier":{"hash":"0x1893db13d569904a47437e2b1f6882ad3152975c45cf026019e3ab63079ec080","index":5},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":199,"stacks_block_hash":"0xb1d50139f0be28fa5e00a5ff971fe9a0053628f38cc162fc6fd390e06e8d2fa4"},"parent_block_identifier":{"hash":"0xb1f872ef7bdb071c1b98598504a38571c10d3d1234d6df3eb95dba1bb3bfc326","index":85212},"timestamp":1668607680,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626a6874646867)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x626a6874646867"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400af56a17f9b87d854f18e579c1787d7358330c96700000000000000050000000000000bb8000085c95c26ab308005181d415258bea6986016ef0f4144cbc7f3d7529d204d54110db1ff8b30c01aeea0e8e0f4e4f1801741068f90247cccaa467bbb8342ce3041010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007626a6874646867","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006f104686173680200000000086d657461646174610c00000004046e616d650200000007626a6874646867096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaf56a17f9b87d854f18e579c1787d7358330c967","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QND8BZKE3XGN7HHSBSR5W7TWTR6C69CWAMCGXP","success":true},"operations":[],"transaction_identifier":{"hash":"0xf71784da6f3573c36e27f9ca9215d95e62344b1e61789e2ce3632002214fb110"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf73f4adb923987ef77a2fa0235dcc95ec9d26cd5e8ab65405c0ac1521f862532","index":85215},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000007f750e3e615bbe7ce166c57b1d07a211013091e6dba1f89a3","index":2406553},"confirm_microblock_identifier":{"hash":"0x199d3b49c36ddcdc4c253c389d1f28d5d3b8e84502888a84d8f89eb8581b99e5","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":202,"stacks_block_hash":"0x8d08697882fcdb88d59d28cae076c34b07b6ec310bdd563189c29e34b41b9c82"},"parent_block_identifier":{"hash":"0x1760dc1905724dd3910b87a0e829d0b9a87aaf86e3a403751667a182dbb00697","index":85214},"timestamp":1668609535,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7567696a6869626a)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x7567696a6869626a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":145,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e1600000000000000910000000000000bb80000e265148457de3796bc80ed1de0a738b898ce96216beb9cd0b27bd6796540b3a315f18db65f12220c5221ee7f518bdf361fa0453bbb9e4a4bc25d55cecaa7ae09010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087567696a6869626a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006f204686173680200000000086d657461646174610c00000004046e616d6502000000087567696a6869626a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0xf883eb6c16a9615c0333f1cdc639529bf84a269c3b9be4e5a2346cc9f6913f70"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x409865665d79968108fe6c2b7cf57bf9c9f0d7bf368a5e5bc2ecaef50c914ab4","index":85216},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000457cb5941179fb56d3f6b3869707adcb5438e82e8b9a56ab43","index":2406554},"confirm_microblock_identifier":{"hash":"0x389321638a1010b47e32d415570f9cee4d6b41c982ba1ea647b0ce1b714a2d3a","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":203,"stacks_block_hash":"0x03a4d904d11df3190068aec6d4b5e657ea3c69ace97645bfae2329a48c493063"},"parent_block_identifier":{"hash":"0xf73f4adb923987ef77a2fa0235dcc95ec9d26cd5e8ab65405c0ac1521f862532","index":85215},"timestamp":1668609926,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706c6f6b696a)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x706c6f6b696a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008eebcc7630f669463187bbab6b9896aff3f4893900000000000000080000000000000bb8000050cec144bc2e725fffcfca592296d6f6c1fa9a367847fad5e3615dbe8ea6e3ac27c50786da7fcc85cf7f1ef2ed3b7574e217a1abef4fdcc7ac6aefffba5d2c7b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006706c6f6b696a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006f404686173680200000000086d657461646174610c00000004046e616d650200000006706c6f6b696a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8eebcc7630f669463187bbab6b9896aff3f48939","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27EQK3P63V6JHHHGYXTPTWRJTQZ7X4975MB90ET","success":true},"operations":[],"transaction_identifier":{"hash":"0x7a9e7509e96d06bd831718f949ec8baac6ccccfe066b4b0395087f36cc68e20d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x340f8734fbc6e9559d0709126fc007bef24d37e24cc730ed31c74b85dadbd94c","index":85219},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000c5690c60804bb5cf2417e4b8cf1a19e9176128ab1449369b205c","index":2406558},"confirm_microblock_identifier":{"hash":"0xde1048c2161ebcfa33ac765dfb3f3c92b01fbb78d1ae851e78c2e49b6dc39183","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":207,"stacks_block_hash":"0x05e6177013267aaa0ddfd29a4a4e3fb242f4e0c8c069ab0d4aa482728608f64f"},"parent_block_identifier":{"hash":"0x364398a0f7eb3237a147e4bcdb6e11943683052292e948ddf43e13bbd2ca5852","index":85218},"timestamp":1668611671,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6173646667686a6b6c)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6173646667686a6b6c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000110000000000000bb80000bcb58466a37713e5be6814bd4c05cebfaf1761d2e142e3b1f105bde9f332615e053da9722ae17870e6eaa6ae616ceb155620edaa4339e804d43709ec04b6226d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096173646667686a6b6c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006f604686173680200000000086d657461646174610c00000004046e616d6502000000096173646667686a6b6c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x564c0e95d831ff76fbc7e37393fce6e2b7642a66a8400a881c9f288a0ede648c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf66d1c1790676849ef6b397e463d7c38085b05e439db62abed05d3bde8ea1e35","index":85224},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000004106916b140373bc27842879d514b302e7efd132c9acbbf9fc","index":2406563},"confirm_microblock_identifier":{"hash":"0xc9eef9ebfc43b4d9be05db884333f06fccfc3fb5e6b19e75a13e915165ff61ae","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":212,"stacks_block_hash":"0x2ec36fd63ca35bbe20beac066afece04a6891be2a237f0caf38c9a0d90d5776d"},"parent_block_identifier":{"hash":"0x41f6b34a46d66f7f0d52c2d1740ba0ec143d03b8d95a964056132842933eedcc","index":85223},"timestamp":1668615177,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6c64766e6c736b6476)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6c64766e6c736b6476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004009b184cd9b6bad0eda71e6e9b89b604de4494fb1c00000000000000030000000000000bb8000003f1675fa7051b50f23259d241ed9906a4cb80df73e0b125a5e408b31cead20a72524075a50348ef2c055629e2e785512b68dd43c6faa39b1300e4e1fc676962010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a6b6c64766e6c736b6476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006f804686173680200000000086d657461646174610c00000004046e616d65020000000a6b6c64766e6c736b6476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9b184cd9b6bad0eda71e6e9b89b604de4494fb1c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2DHGK6SPTXD1VD73SQ9Q2DP0KF4957V3JFETK3E","success":true},"operations":[],"transaction_identifier":{"hash":"0xc3850b900677e0240a1111e597c8677f25998b41ee9885c7c1013b1529568566"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x361272defe6b639a3e83861bf321dad2be9c1449ef22533b922fb92f4b2b03ee","index":85226},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002bd8ea8e9c3cec8de018efc7ad352181af2b1eb2ebb5106572","index":2406566},"confirm_microblock_identifier":{"hash":"0xe723a9e19b584343a02b250be964d4ba441a1158f46eb145da0187b08cc93681","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":215,"stacks_block_hash":"0xa75852c92215a6d3604b44b269bbb1b11930d8cfd0b7761bbefb87988da23681"},"parent_block_identifier":{"hash":"0xa850c26eb25899b732c8d4ad2bffdd4b6490040aee5f6955308472e9b090279b","index":85225},"timestamp":1668616640,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e62766774666a676b67)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e62766774666a676b67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004008eebcc7630f669463187bbab6b9896aff3f48939000000000000000b0000000000000bb8000110441bdb0bb90f316f3c08c1e7a0556389876781543e1fad7c1aff4e2f824bf278c38992c5abf67bcc1ee4ca9d3163ceccf4f51f4845740e5fc31e2c154dad97010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a6e62766774666a676b67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006fa04686173680200000000086d657461646174610c00000004046e616d65020000000a6e62766774666a676b67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8eebcc7630f669463187bbab6b9896aff3f48939","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27EQK3P63V6JHHHGYXTPTWRJTQZ7X4975MB90ET","success":true},"operations":[],"transaction_identifier":{"hash":"0x83deba92cd8602a502eae3bb5521e5e08f11e5dcc4c2d76f0fc42664eef89ce9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x228e8462ce73e350c0aab562c151dcf9dcaab1f65d68a66e345c1396844ab8dd","index":85227},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000002847b7840f40754f0f0924caec72f95ca534485e36e79507c9c4","index":2406567},"confirm_microblock_identifier":{"hash":"0x28632e952fa0b3ebdb2480f6cac79e6214b9b795913ceb29cff25cdfffe049c4","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":216,"stacks_block_hash":"0x60ffcb938900010118d83a656b676f3fa6554da2a8bc229b2896d5a3bd645807"},"parent_block_identifier":{"hash":"0x361272defe6b639a3e83861bf321dad2be9c1449ef22533b922fb92f4b2b03ee","index":85226},"timestamp":1668617758,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a626a6b62)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6a626a6b62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":148,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e1600000000000000940000000000000bb80000004242e0efa615b280d7288e64277c74b8431c2f06d94af1df24e87d4ea187bc15fa6683c9fccdfad031d0169c7018eaccb8abdab37b809f28e2ed3080aa34c4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066b6a626a6b62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000006ff04686173680200000000086d657461646174610c00000004046e616d6502000000066b6a626a6b62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0xfccb035a2c13934199104df51c95416ed55297d99411495553964cf5d00762e1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb39030dc63699e1ece65aaa740879452546a5c60a79d6b0976233e495091e7d5","index":85229},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000059d4ab37176201788b706cd9bc2342a68d8726ce730315abe89","index":2406570},"confirm_microblock_identifier":{"hash":"0x78ce1cfb28b631d638b948d535fb1d8bd336c6109e4a9a81133d4b8a29c07eb4","index":6},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":219,"stacks_block_hash":"0x4c0d231a833d59a6c63d9c92614664618ec9ad7ac2bf60834a7ea48e6f53c786"},"parent_block_identifier":{"hash":"0x06ed02d8389a5abcb56615f9f33adcbf77d515832cc46c382c2b80bffe7f3a47","index":85228},"timestamp":1668619155,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63736463736164667765)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x63736463736164667765"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d8054000000000000000f0000000000000bb8000026f78bdbe7127478b06455e6d695fe1e8e0fd5ecb0c7dd3f3bde9d0dc07edd43296d3b271ccb8eb0ccfe1367361e9c67cc569283155c0ef605daeba9a6b5c484010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a63736463736164667765","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070104686173680200000000086d657461646174610c00000004046e616d65020000000a63736463736164667765096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0x85971dc8ce3cdc50a18a159954e6f5ba4b5aa97a56ab05971c2996b9b15b6271"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1d7d4ba6e3f3d54889c5879df5da4c63c9a6f8f91ff4cffd4b48bad21349d4c7","index":85230},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000029e8c238bf1f0ac95e14c8cc008d6275869d7277d2673dc69e","index":2406571},"confirm_microblock_identifier":{"hash":"0x50ee28365104bd23c1c2c4b9fc6f6ca9ccd6065c5e05920f798cb091e8915121","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":220,"stacks_block_hash":"0xa5f212e9d9eb3a15794ec570e27a19c74f4f357293b73f98f6d628448333ebaf"},"parent_block_identifier":{"hash":"0xb39030dc63699e1ece65aaa740879452546a5c60a79d6b0976233e495091e7d5","index":85229},"timestamp":1668620414,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6373646c6b63636e6b6c73)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6373646c6b63636e6b6c73"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400af56a17f9b87d854f18e579c1787d7358330c96700000000000000080000000000000bb80001025a74b067b4edffd068d55e1236bfa347366ad054133387e4e676b10cc6bde705eb56a4813efd38160d5c038cd5b8c3dfdd3202678b46bb5eba1314453b46aa010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6373646c6b63636e6b6c73","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070204686173680200000000086d657461646174610c00000004046e616d65020000000b6373646c6b63636e6b6c73096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaf56a17f9b87d854f18e579c1787d7358330c967","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QND8BZKE3XGN7HHSBSR5W7TWTR6C69CWAMCGXP","success":true},"operations":[],"transaction_identifier":{"hash":"0x399b2565d898e7c18913c50d365590a5efc799b943c65a0aace44b8d372da653"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6373646c6b63636e6b6c73)","execution_cost":{"read_count":12,"read_length":43984,"runtime":131938,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6373646c6b63636e6b6c73"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400af56a17f9b87d854f18e579c1787d7358330c96700000000000000090000000000000bb80000f03a1d06e87fd7c68b2b5b5df6d7c3f98c0a8a5cad7547972ac1f45d19e5a3656a34cb9b557f07a8997fb2a78fd3298655e7ec7b31d8a4117fb648ff069de5c6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6373646c6b63636e6b6c73","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2QND8BZKE3XGN7HHSBSR5W7TWTR6C69CWAMCGXP","success":false},"operations":[],"transaction_identifier":{"hash":"0x543a6fd8d4455e36af2827f51f0f847800ee97769d924e6071b791b3005d4641"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6158e51a8ce37efee0eba8796e8e330a1dfc4b7bf9f9ba9ec5dd584c2536d994","index":85232},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000464965bc21507c5d33556e8130961808d6cf8326395d331bff","index":2406573},"confirm_microblock_identifier":{"hash":"0x678aec0b8a35280d58534eb44e1ebc32e913bc6f3afb2aad73a62adc475ab636","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":222,"stacks_block_hash":"0xee6e45499f56fffaeb0259586f27e5668d9c03661db13171d11dedf804a606ae"},"parent_block_identifier":{"hash":"0x36186ae26a152651ffd8e6f826f9d3952449702346b4da6cfa36b3eb9eaa4464","index":85231},"timestamp":1668621006,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x766766687479)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x766766687479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d932500000000000000120000000000000bb800015788eaef535f2c46729c67985e8595666f66111c8936851f3a8a83c5f5df312c00f2bcb97a43648dcf0cc9b2945309c849fb894a875e70f797a36d57033c05f3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006766766687479","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070404686173680200000000086d657461646174610c00000004046e616d650200000006766766687479096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x76ea0f45ce3a50169640c5fccb038950fe86534d1a7fe412df562e0a46f171d9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4a9e28a85c4ceb5ba3b5f9119f20ad8ae0854121a4bb1e43766489abaa1ee71c","index":85233},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000de396adfb7dc4c32882ba4ba9d2e0306f984d4dbd8c7a0a4ab5d","index":2406574},"confirm_microblock_identifier":{"hash":"0x63cf54bb5b546ee93616503276237e21ca16d53f3257f3c9a551afcec4808668","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":223,"stacks_block_hash":"0x805675364d856b4b728c7751f73293801ad4827929b87238c050eb6eb06e92f8"},"parent_block_identifier":{"hash":"0x6158e51a8ce37efee0eba8796e8e330a1dfc4b7bf9f9ba9ec5dd584c2536d994","index":85232},"timestamp":1668621229,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7673647661736476)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x7673647661736476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":151,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e1600000000000000970000000000000bb80000a7ad495da542cbf24d563589adc061fa96df031a2b9071c1c0a5fef9d53f5daf4ef580d03b00b0c5d8d097d05dee977d376fa042b01e41114847af0e5d78c836010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087673647661736476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070704686173680200000000086d657461646174610c00000004046e616d6502000000087673647661736476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0x6eb31146317019c400d41701f8d748f355504e23bd79507325715776d90309c0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa42b2dee07eb05eea251b567704965e6fd9cebc56931cd261073575b90bd6168","index":85234},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001cf2cd7d29c4731c519e5182af5987dcc04bc9210175a48bca","index":2406575},"confirm_microblock_identifier":{"hash":"0xe8fa4858908e004567e8ff71a7cfc3b9e5f4c51f1ee772b175ae5c2ce34062e1","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":224,"stacks_block_hash":"0x803a29de92d34b694d6bdb0bc3652b0a27b4942bd2a863ff8df8ed41095d304a"},"parent_block_identifier":{"hash":"0x4a9e28a85c4ceb5ba3b5f9119f20ad8ae0854121a4bb1e43766489abaa1ee71c","index":85233},"timestamp":1668622446,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646361736363)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x646361736363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c4000000000000000b0000000000000bb80000af0ec1b238d1d64830552b7de1a0bf245b45ff4c396aae4327ff8a4114ed7faa51d1b49fa86336dea616ed75929022249c52a384e20dcae45545f1b5c3d5fef2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646361736363","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070804686173680200000000086d657461646174610c00000004046e616d650200000006646361736363096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x2df30b581b8ff709228eaca90a0c598eceab57d247909be114928845f693d8b4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb7d6d8bc5640d610a448f56a91239e448573ee36d06a3f090f0a03c27b4c78cd","index":85235},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000029e160833ef09cb3df9624b3cf26605038dbea6a6ab1f865d7","index":2406576},"confirm_microblock_identifier":{"hash":"0x517eab48eb54f7c2c6d2bb7194424897fda8fe4ac9ce587eb509683a4f34f3d5","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":225,"stacks_block_hash":"0xa05a56e2fe588e1321073adc2bb5149e8fa2bb517c6c8997f63fd45714432253"},"parent_block_identifier":{"hash":"0xa42b2dee07eb05eea251b567704965e6fd9cebc56931cd261073575b90bd6168","index":85234},"timestamp":1668622633,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696a6e696e6a6e6a69)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x696a6e696e6a6e6a69"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004009b184cd9b6bad0eda71e6e9b89b604de4494fb1c00000000000000060000000000000bb80001a92ab8d21e2007bffb4db0f04096d74e0e920fc2d8e35a0653f94527f50e026143a186adfd94b1109fcaf44f1bd1a56a83c7c0e87d631681504125b89e2debcf010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009696a6e696e6a6e6a69","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070a04686173680200000000086d657461646174610c00000004046e616d650200000009696a6e696e6a6e6a69096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9b184cd9b6bad0eda71e6e9b89b604de4494fb1c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2DHGK6SPTXD1VD73SQ9Q2DP0KF4957V3JFETK3E","success":true},"operations":[],"transaction_identifier":{"hash":"0x3517389192d6a65ecb3e91ff7cd535ab80a8a668197800add4865cca6a63a2a4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfb8ddeb9713dae4d3e5113139f07b19fab05a2a3f04b478ef27cf0e8a8eb7564","index":85238},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000092e7f6a43087f6d36d1261e6bab2aafeee8264becf5bc7fef","index":2406579},"confirm_microblock_identifier":{"hash":"0xe5421f350e7f8338ce89cca4018d19c666d0d085df67357c4ad7d6818ac19676","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":228,"stacks_block_hash":"0x914ae63c7f9332304499b2eeef91b18f7aea895085c8199bf042d770128d0e8c"},"parent_block_identifier":{"hash":"0x1d8a33449f1b2b9b4bf409529209bbb653720f1c5baa7dabd03825a5b07ce3f3","index":85237},"timestamp":1668624059,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6d6e6c6b6e)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6d6e6c6b6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000140000000000000bb800004c1ba8db014e2ecce57ad6ce2d1349cc24d1c660677aa47e8a6f3af122eae68f2bd8d43e78491ed7458e661f110423395e7cca43236e582b88e51544da9d0445010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076c6b6d6e6c6b6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070d04686173680200000000086d657461646174610c00000004046e616d6502000000076c6b6d6e6c6b6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x75ea9f0d6fc8335e702924816d04d104d3ff4b17d9ebae21d5bd753b69bfa90d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe0ed40761d6bddce807e7255b3bde2c74a7f105846b318bdaa50e02438273e2c","index":85239},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003c26680886e9ec42ac9e532a5c7a83c0a947b19f46571f5e9d","index":2406580},"confirm_microblock_identifier":{"hash":"0x9ccc3e8c5a47149743c530f2beae8754ddacb9d937cff003d623cae6ff9a91e8","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":229,"stacks_block_hash":"0x4ebcfaae534064bbeb0daaf3858b5507c8b88c9aa23ae2d5571749c3a2bc5026"},"parent_block_identifier":{"hash":"0xfb8ddeb9713dae4d3e5113139f07b19fab05a2a3f04b478ef27cf0e8a8eb7564","index":85238},"timestamp":1668625044,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6a6e6c6e6c6a6e)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6a6e6c6e6c6a6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008eebcc7630f669463187bbab6b9896aff3f48939000000000000000e0000000000000bb80001a7e07ae61a75dba5829f4b6e9f2abdb8d14b05c6985cd91dc0172be3cb62b4183175e13157595f3353c4080ef109e28ca8e56e4cec8b64b6ec96a7f51388a679010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096c6b6a6e6c6e6c6a6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000070e04686173680200000000086d657461646174610c00000004046e616d6502000000096c6b6a6e6c6e6c6a6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8eebcc7630f669463187bbab6b9896aff3f48939","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27EQK3P63V6JHHHGYXTPTWRJTQZ7X4975MB90ET","success":true},"operations":[],"transaction_identifier":{"hash":"0x034f75e002581db77a94a4927f5d90c5269bc765b4923a5d2081d4cf319aa263"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x51f67805174cbcf189b500e5cfbe237d9fa044a497ec926af0506bc744e863b0","index":85240},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000042f8f9613e75dd3830753d380a5575df3f26cce8c0920152e5","index":2406581},"confirm_microblock_identifier":null,"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":230,"stacks_block_hash":"0x4ba3d8fb9ea84df9c7f2351c1e194603d3cfe4963b24f84a52a24f7847696477"},"parent_block_identifier":{"hash":"0xe0ed40761d6bddce807e7255b3bde2c74a7f105846b318bdaa50e02438273e2c","index":85239},"timestamp":1668625503,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a6e6a6b6e)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6a6e6a6b6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d300000000000000120000000000000bb80001a48dc8a0407ca4845583f432c17a2e0ee2633d7d4bd28116841f483ae7e2de1c4773c8061ec95ecf3976d90a1b9a642baa68199c30335651da0c94f20691074e010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066b6a6e6a6b6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000071204686173680200000000086d657461646174610c00000004046e616d6502000000066b6a6e6a6b6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x23663c8d88a7dc0b755f5bc41cfe29752de25424268c575d3d44f676797befea"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x17e6894fe96cc209fcfea15ff9893d27f97a915b25531a5c0141134e00e42615","index":85243},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000004738bdb24a027be136e9e8c2f555b560e6c6d92193ec411c9a","index":2406585},"confirm_microblock_identifier":null,"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":234,"stacks_block_hash":"0x359ccc056e2abc9fc8a212ae84ccb0e5b32e52ea0a9097d666cb9e8100916d0c"},"parent_block_identifier":{"hash":"0xddfab2575b376c356b6e19074b90ba74ce3dd7dafb2ff931eaeca8ab56186431","index":85242},"timestamp":1668627334,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6c6b6e6d6a6e)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6c6b6e6d6a6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":154,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006c4236749a801ed99372a0f42d50efde8a627e16000000000000009a0000000000000bb800014cb3eedb97f714032bb1708f117f636a25beb75ffd513a059f6c8fc3bf1050fc7b45db4c45726de0b9b0a1c07dc7deef258dde2d2d14487e9799db08e8a6898f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e6c6b6e6d6a6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000071304686173680200000000086d657461646174610c00000004046e616d6502000000076e6c6b6e6d6a6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6c4236749a801ed99372a0f42d50efde8a627e16","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1P44DKMKA01XPCKEAGF8BAGXZF8MRKY2SF20B11","success":true},"operations":[],"transaction_identifier":{"hash":"0x7a930073de30e69a07735557b0e92e0ff34711d1a8e6c6158a712c50416248f4"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646673616466)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x73646673616466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004009b184cd9b6bad0eda71e6e9b89b604de4494fb1c00000000000000090000000000000bb80000a8c41bbe96337c5fe0a3ee58f79b90b0bea48aca34b85581991710de8db6207636dbae2188eb9ad84ddced2eaf6b52e7945d57ce3e173d1e228937cbcb24d9c6010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773646673616466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000071404686173680200000000086d657461646174610c00000004046e616d65020000000773646673616466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9b184cd9b6bad0eda71e6e9b89b604de4494fb1c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2DHGK6SPTXD1VD73SQ9Q2DP0KF4957V3JFETK3E","success":true},"operations":[],"transaction_identifier":{"hash":"0xe75790eb35a980823978724e5560e8372e1c23756fac301b2436d0edc2f2184e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x86fe3c5292b0bf95173d66a530198b533da9a2fe2e8e284b6f04421ebdefd824","index":85244},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001aaeb07af88973b6c971eaea093fcfc71bd4d9c75d9d948e58","index":2406586},"confirm_microblock_identifier":{"hash":"0x94bc4aee1b0c204958cab52fe0bb3572be2aa9050309981411deb8b4f4eae3a2","index":3},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":235,"stacks_block_hash":"0x3b1617743d1018d3ddedb6fe176a532c0bf69bcc922ef0842cc096945b30e1a9"},"parent_block_identifier":{"hash":"0x17e6894fe96cc209fcfea15ff9893d27f97a915b25531a5c0141134e00e42615","index":85243},"timestamp":1668627536,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6968756967)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6968756967"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c4000000000000000e0000000000000bb8000183561e0325c9bf6601242b2355feccc12c4d8e911a0534a223137320674f9d5030713e58088dd70ad05be07a13d4ba8e360fe6d837206bd16ac23627ab0963f9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056968756967","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000071604686173680200000000086d657461646174610c00000004046e616d6502000000056968756967096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0xd7edd2b7937d21a09c727f947ba2146595cfe65a0988653b63a96ac511c2f6f4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x73edf006f95746975cc1094bea0b1c4555c170c6781ff5b50741a310df7197ef","index":85245},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002d4b7216a708782602bf2f630ed02c2cd00e92cc872be111f0","index":2406587},"confirm_microblock_identifier":null,"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":236,"stacks_block_hash":"0x7c1ab0f7f3e7c146dad8e8982d71f053a6e28338d872b92a108892d3cd761930"},"parent_block_identifier":{"hash":"0x86fe3c5292b0bf95173d66a530198b533da9a2fe2e8e284b6f04421ebdefd824","index":85244},"timestamp":1668628259,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a626763667864676366686776)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a626763667864676366686776"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000120000000000000bb80001324f44675b713959cafa89e48f34487b260e7d7bafa3b971008175308429ab6a347c3c030ef7cde7842fac4d8b98f5b599b4b12750b02ca132ba6cda80839f2a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d6a626763667864676366686776","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000071704686173680200000000086d657461646174610c00000004046e616d65020000000d6a626763667864676366686776096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0x2c8673193fb7493cd87476b85c25fa586e9a8e75eef9950b45cea25672cef2e3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xad05e0c81e8c2e40fe9179d970d67593d42b07f28ef80a33636e29f7dbc27d2e","index":85257},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024e554894d68b6adc9a7bd5a869e2fccec8d77b9aa96e891e1","index":2406603},"confirm_microblock_identifier":{"hash":"0x0ab0eb5b49d6786ddeed850a206f0c12f1f8e64d5bb0463a55338ed15e379958","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":252,"stacks_block_hash":"0x786080e1503c9caf98cd7873586c1abc00764d50022a79665bda1c9859c7cecc"},"parent_block_identifier":{"hash":"0x253fa58111d9b5f99b54d75f1c1951114f39a0ac31937370019f55ee9b195878","index":85256},"timestamp":1668633945,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x637364616373)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":30000,"kind":{"data":{"args":["0x627463","0x637364616373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c4000000000000001300000000000075300000c197b2561bd9a77eb45e2b1cfd4140740155b3238bdeade5df633091a18490df6bfa6747d212b6361152520165865b181a795e721e2294136f3cbf505047dc31010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006637364616373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072104686173680200000000086d657461646174610c00000004046e616d650200000006637364616373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0xe101b4054a3fd47e922dafc89e7d5c295ab3b84ece92df2416b0b350e35692d3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7418b384326de2837a04eacf89fff079fc6a85ea94ca3b2840fe6babc04b7a77","index":85343},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003fbfa221cd29784d3238e63875da2d47869b2ecc04639b1962","index":2406706},"confirm_microblock_identifier":{"hash":"0x258a308fd2277e43a8828704320c17b1f5829758f74e306189e93b498d9fa46e","index":1},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":355,"stacks_block_hash":"0x8c33387a487310115df6460dd090e2ab800b317169eed57d9d3d0b64e9822db1"},"parent_block_identifier":{"hash":"0x2cced4bab16bcb87de64fe248656a7a3c7eb45021632a30d0e3c84abeb4f2c74","index":85342},"timestamp":1668678734,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7361646c666b6a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":48000,"kind":{"data":{"args":["0x627463","0x7361646c666b6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d93250000000000000017000000000000bb800001f294e6812e1c9eeca194b32345085ca18434ae468a56f72d79cbbd7fc54d197f0d208eac0649b0bc25df9aeabf14edd1fd33ac70498295fb383f246696a34568010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077361646c666b6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072904686173680200000000086d657461646174610c00000004046e616d6502000000077361646c666b6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x21415ee6f294968b50e1bf6eee41802f8afe10f8045bb2ebb7fa5d243b7786a4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x905a0895ac5ad807183dddebc3acf53fbf5b1d284cc28fa79cc136a07157d45a","index":85345},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000069f08bdfcc83a73a1a13185fa0c97068aaaf5e23c2dc7a1b9c3e6b90","index":2406708},"confirm_microblock_identifier":{"hash":"0x67b3be5cd4df3084e9a72772846665fdcbaafcad27118f2a8cf6532fd624c66c","index":4},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":357,"stacks_block_hash":"0x09a3516715344df270e1f097b0b3f77de0f315b6c61b67a7fefdb8a6cf2a942d"},"parent_block_identifier":{"hash":"0xfbbdcc93bb568f937b311b35b0ce85652312538815aad011647b78f8a4310331","index":85344},"timestamp":1668679926,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b6e6268766763)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":393216000,"kind":{"data":{"args":["0x627463","0x6a6b6e6268766763"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400f26d12ce74eb0e6d6cd5427486b6cc90f824c67a0000000000000000000000001770000000005bd53f832eefe0234b29bab534a6cd91dc0569164effb0a7b321e65a20650d8276875c3eeef0c9547b30b58a797086e710373b108858af59094841361eb0867b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086a6b6e6268766763","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072b04686173680200000000086d657461646174610c00000004046e616d6502000000086a6b6e6268766763096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26d12ce74eb0e6d6cd5427486b6cc90f824c67a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6T4PEEKNGWVBCTN1791NPSJ8FG966F9KP46QJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x5b8bd807a5e087e3012f898aa19572e118b900f2a95e90ea80576979dd165f43"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e5f63)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e5f63"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000090000000000000bb80000a16dc0fc16a7963e815f7f5b2afc681a0b52631feba99e3cc48fee80e53bd7b270f54cb7242632cd4390439e210ee85c972216aa24e9945d3c416173de9a0a8a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008646f6d61696e5f63","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072a04686173680200000000086d657461646174610c00000004046e616d650200000008646f6d61696e5f63096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0xed3f8037947979dca5c2914359e5fc71fcd85e295443fbb2c13277d9cf79fd3e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x220c11090bcc19f3ee08b8164a23805795ecf4d28fbcbf52a837f9472bef6beb","index":85346},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000051905cf824151bdb133571d6ee77cf58119f5e92694bebe0c","index":2406709},"confirm_microblock_identifier":{"hash":"0xb7a241e2cce07973ef3ae0255e392a6158e55d44e1b6c630a21a3ac6e5a18c94","index":0},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":358,"stacks_block_hash":"0xb3d8b516558f0d26a8743bab1ecb8dee90bc0aced854f18743d44727651e9c55"},"parent_block_identifier":{"hash":"0x905a0895ac5ad807183dddebc3acf53fbf5b1d284cc28fa79cc136a07157d45a","index":85345},"timestamp":1668681137,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61736664666173)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":12000,"kind":{"data":{"args":["0x627463","0x61736664666173"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400348a3799c6e7d92dba88a9820460437bcabf02c500000000000000000000000000002ee000009f21b7c79ede3044dd405e80779b3d28dafb8c288cdc3438b978b29db114e54b3232ec6fc48a4edff4b195f71a80dd2a1a77d7a2d0339531bdad75b186cae0f3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000761736664666173","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072c04686173680200000000086d657461646174610c00000004046e616d65020000000761736664666173096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a348a3799c6e7d92dba88a9820460437bcabf02c5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STT8MDWSRVKXJBDTH2MR41308DXWNFR2RP2D2QKQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x014cdfce99ef4786a7b9a3a5f69958831f4bca973a9f98b574757b854eb3f098"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x17822cbe9416235ff38fda3c6b14e23119ef8508eb82551811d453608430daac","index":85347},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002aac2711fd7e0d21c668fc62405d3acd1aa5ef4d2e6848c52e","index":2406710},"confirm_microblock_identifier":{"hash":"0x426fde629bfec4e08efef5f65082e60f2b5cafe5a93ea79da78e5581358736d9","index":2},"pox_cycle_index":387,"pox_cycle_length":1050,"pox_cycle_position":359,"stacks_block_hash":"0x3626f683f25d91cfa8bb41a653c18d430fa83759fd17ae24deeefd484a2f2e10"},"parent_block_identifier":{"hash":"0x220c11090bcc19f3ee08b8164a23805795ecf4d28fbcbf52a837f9472bef6beb","index":85346},"timestamp":1668681378,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6572747975)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":384000,"kind":{"data":{"args":["0x627463","0x6572747975"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":22,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa380000000000000016000000000005dc000000410848b7edbc96aa80b14fe78785c1ac4fcf08505f6098dc3d98a379dc8aacc311d82e58d9368823673e6c77a65fe34bd4cb1878bce0f1b742a96b9fa54644b9010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056572747975","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000072e04686173680200000000086d657461646174610c00000004046e616d6502000000056572747975096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x66d1688ca39dfbf62e854bc0093245c0050972bf3398bac8d58022dce4b24c2b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd5cdafa6f255729d1f50066b23d53c4043eb6d4eae331332c94355de7f498576","index":86204},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000002635d9dec0876e05bbcec9640f7b0091d7550f0ce3ed10b90","index":2407666},"confirm_microblock_identifier":null,"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":265,"stacks_block_hash":"0xb982a061c8587dc3bf4d70544941a0330aa9f0a567dd5d97bdfaf9a0946f3dcb"},"parent_block_identifier":{"hash":"0x5be8ee130eabbeee0d6d8417a82fe278d135aa7c3e122e14148a2d374db6e828","index":86203},"timestamp":1669108579,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x766768766a76)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x766768766a76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":25,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa3800000000000000190000000000000bb800013d6500aed6b015c51ac92a7ec905362c40f03857eaee542623a49609c5cab54d095bcff478841f2c39d41e71234407810c8c58a9548382bb0238c8d775049a87010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006766768766a76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000073404686173680200000000086d657461646174610c00000004046e616d650200000006766768766a76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0x2849ccdda7f5ce536d552e227c68829a0e1a70efd1692ad005a0217dedcedf0c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x805f06d8eccdcc7f0f59c85fbb55df3afe6c7950d6029ef2721abdc955d00c68","index":86280},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000084d9e05cf38a81eb1b3303673e642d08a102af61b1cfe0c0b801","index":2407768},"confirm_microblock_identifier":{"hash":"0xafaa65f372c469610710e1436f5a81ce8aea53b894ce8f7821170dccf2b4a0c8","index":1},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":367,"stacks_block_hash":"0x46a91bc0d9b154b583cd6e8babca0ab37f6d041232093b400ac4cdeb09a47ceb"},"parent_block_identifier":{"hash":"0x60d3cea8c49f892408e307005c4b95bdecc578dc7a2103123a52ef8da5dbf914","index":86279},"timestamp":1669154627,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364666173666461736466)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3750000,"kind":{"data":{"args":["0x627463","0x7364666173666461736466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400348a3799c6e7d92dba88a9820460437bcabf02c5000000000000000700000000003938700000338076c68b6f63139842488e8fbe3fa9a53513b60f75ee076db500b01e3dc52e09854ec848cea491c427b34cfefb9f893c665be5b153193052d1f55ef7fe3d68010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7364666173666461736466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000074604686173680200000000086d657461646174610c00000004046e616d65020000000b7364666173666461736466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a348a3799c6e7d92dba88a9820460437bcabf02c5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STT8MDWSRVKXJBDTH2MR41308DXWNFR2RP2D2QKQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xa0342270746e5039cc09b6314a81d81893b39cfd5c591ed678c3778e405da33b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x73a8c3b9e62e1e29f7c516b5a07c91c3e32fcbc16dd04ebea304e3340bde6be9","index":86281},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000110d1e3a5929a2eb7ca418d7b548506d229d3e6eb24b5c0366","index":2407770},"confirm_microblock_identifier":{"hash":"0xb8ccb63487e022951dc6127e09f2a4c8cd795bcbf5e6588e37e01702e0a52122","index":1},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":369,"stacks_block_hash":"0xf8aaa2e3fe72bd78e03e6b8293682fad7ba0d28dbfb0adea8d909e9fa516da99"},"parent_block_identifier":{"hash":"0x805f06d8eccdcc7f0f59c85fbb55df3afe6c7950d6029ef2721abdc955d00c68","index":86280},"timestamp":1669155838,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a73646e766b736a646e76)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":30000,"kind":{"data":{"args":["0x627463","0x6a73646e766b736a646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":27,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000d073907a4b7d4400fa949621ea7fec0b12d9325000000000000001b00000000000075300001051642311d32811a133f3a8f73401647cd50be44b62c8336eedd21302832721439e14a63d5b0cfa569b314064a73a6bf22a8d047e4000a0eb78700f7a322f41b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6a73646e766b736a646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000074704686173680200000000086d657461646174610c00000004046e616d65020000000b6a73646e766b736a646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0d073907a4b7d4400fa949621ea7fec0b12d9325","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST6GEE87MJVX8G0FN54P47N7ZV0B2BCK4MKMDV7X","success":true},"operations":[],"transaction_identifier":{"hash":"0x112b913482fb880b90d354e4609b58d85a3f914e62c573f9389bab09b62ea614"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b626b6a626b6a)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a6b626b6a626b6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":28,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004003a7c5239fa9d8395dd073f45f2dd390a5cf8fa38000000000000001c0000000000000bb80001fed8f5a32ddfeebe379a28fa7d04ba4008dd4f2222acd81ba6bffd873a80e4be7be2da7800f589d16a067b7d4eff6f77f896e6f8d3681c6751e305fb30573e88010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086a6b626b6a626b6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000074804686173680200000000086d657461646174610c00000004046e616d6502000000086a6b626b6a626b6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3a7c5239fa9d8395dd073f45f2dd390a5cf8fa38","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STX7RMHSZAER75EX0WZMBWPX7455SY7T72ZBS62F","success":true},"operations":[],"transaction_identifier":{"hash":"0xdc7ddad093d5dff94e0ec476750a5daf5790b0946aa28e49c323ebbf34a35711"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x63c92c0742cfe354425098ce98e6ff99281cc1f6727fc0653808516989c661ee","index":86351},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000ee89341ac3510b577de95ee458f6720b45e07f9bb68941a21","index":2407859},"confirm_microblock_identifier":{"hash":"0x71d38ff37be9e12d104ef2fafff707966e661a571d198c7a3456dc18997b82c4","index":0},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":458,"stacks_block_hash":"0xe1fe925176a9f29c967151157a2cf7f962f78150f0e82ef8e54098d9dbb25643"},"parent_block_identifier":{"hash":"0x890efa4108a53a34c2385a1c9a652840d55e01f943f8b006c05afa3862e60612","index":86350},"timestamp":1669199727,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6f6f6c616964)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x6b6f6f6c616964"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000130000000000000dac00014b7a301394636df8182dbdb838fe147d4029a30085a503e8ed98a1b7933080cd28782de691be7e9687242d2f672561765ad80a9775366a9ad9632e7dec39f540030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076b6f6f6c616964","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000074e04686173680200000000086d657461646174610c00000004046e616d6502000000076b6f6f6c616964096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0xc46cde5e3fdc5eebc8fc9c3b3e14f54a98e582bac5b9298b9150d2e1e29a787a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x166ac12830e27db28dcf48c3c077842b12a61b819a254efa3b194bf870929c87","index":86489},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000091316dfbd90467dc9735929124aadd92f01b4d052e3b6cea59b","index":2408031},"confirm_microblock_identifier":{"hash":"0x64c243f7e8097b2954d472d18e0aad65f7b0d8c582d0fd4399fd4b62ec36bab1","index":4},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":630,"stacks_block_hash":"0x4edfa32b627208710260ece9044be7af13dd71ab951f6cba2b04e1a81ae8a483"},"parent_block_identifier":{"hash":"0x3b3b7d32f3f2399d6341863418a75a7d1d42b59590667ae75ee58f03a63b723b","index":86488},"timestamp":1669290048,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616461736464)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":24000,"kind":{"data":{"args":["0x627463","0x616461736464"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":31,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d3000000000000001f0000000000005dc00000a0f3ee9b7c97a35a1c8f168232c557c7edfc492167987cefb618924d125d8ede6a24fc1de628f813eecbedad5e474ab3ae5c0a0b7899aae98154a9aa9b85fc25010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006616461736464","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000075304686173680200000000086d657461646174610c00000004046e616d650200000006616461736464096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x0f23e612b2c51a1ff8eb09ec79fa98126b12d1d48ce69d9d7fb73a9add8afdf3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8daadd3950834f629db1a81d1096d95aea2b0d8c7a51244459036d37b1a1f434","index":86500},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001bd8436f422d628807a758705e8fe8f8b1dfaa5b92526a42ac","index":2408045},"confirm_microblock_identifier":{"hash":"0x0b6160dca4e3d4988f3dba08fd516131b0842701dc23a64ff790daf063bf09f1","index":1},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":644,"stacks_block_hash":"0x34fa43ab31d84019ec0e748ccddf0ec222bb01f2dafcac1eea27fb64ccc8629c"},"parent_block_identifier":{"hash":"0xb3bc013477823f78a259fecf944409bc3b15d35d59c92a9ece144d1ac39e7888","index":86499},"timestamp":1669295496,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f697567626e6d)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":6000,"kind":{"data":{"args":["0x627463","0x6f697567626e6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":22,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000160000000000001770000055f952eb6292efac0a75f285b80104e9a9f058a21cb5e611fb3859884c0716bb49484e471f22cf03663444e574c7febcfe054326adeae5fb0532df1de3516ab0010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076f697567626e6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000075804686173680200000000086d657461646174610c00000004046e616d6502000000076f697567626e6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0x625bb1a191204668cddb8be8c121707a23e3eb9c1c51c31121e49ed99c93b9a4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc1caa216023c4613d334a6c90674b8b9e4c578680d0530928e75aa6dd4e412ed","index":86513},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000018e2a9f1d53651d2b4f4fc282e39fc082f5581952f0c3721d5","index":2408060},"confirm_microblock_identifier":{"hash":"0x5be23852bb833dae25866a84660d63d5fa92760ea4570003d0f6bbf3c5f99371","index":2},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":659,"stacks_block_hash":"0x181f3beb90a027ff9bb176c387fee5447d6acb43dbf677c370da55962e284b61"},"parent_block_identifier":{"hash":"0x15ef7c50184f4c9c8720a8c242dff6ba536b6f2b0cb4d88f9de6e541ce735888","index":86512},"timestamp":1669303118,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7061636b61676575706461746566696e616c7632)","execution_cost":{"read_count":16,"read_length":44040,"runtime":167620,"write_count":2,"write_length":171},"fee":3000,"kind":{"data":{"args":["0x627463","0x7061636b61676575706461746566696e616c7632"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006b668c1727d5cd3eafec7976d9cb7da9c03737aa00000000000000000000000000000bb800019aaf2ee89b92c3df639f310d9bc088b494cdce9f3aa87a3c031fb7cc8c72bff03b3702ec6ca6faa112a84cfc94c5b86f33acc2f7ab3505a23177a366c454d23a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000147061636b61676575706461746566696e616c7632","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000075904686173680200000000086d657461646174610c00000004046e616d6502000000147061636b61676575706461746566696e616c7632096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6b668c1727d5cd3eafec7976d9cb7da9c03737aa","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1NPD30Q4ZAWTFNFXHWQDPEBFPMW0DSQNAHPJVM8","success":true},"operations":[],"transaction_identifier":{"hash":"0x5db6635b0b9a7b69790550ea956c7ab27d3a906bdef1ad1ef5d326d9554328f3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6a5d6c513edae089f62cc380958999252e003d764a9cec3b9128492ebe207f9c","index":86630},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000037e983090cee039b6e3fa0132d8fa487ce22fc34519dbf9395","index":2408223},"confirm_microblock_identifier":{"hash":"0xcf8396879db766a5b36463ef456d2caee3335d31d1527ee9e0c98c69bde11de2","index":1},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":822,"stacks_block_hash":"0x345ca0bd0393f372baebdc190bf3218599c7da9f12f0683e15e89108d7949cce"},"parent_block_identifier":{"hash":"0x9404c8629030aa653ba6bccdec15e050eb770495d3ea2f59dba26927f91723d6","index":86629},"timestamp":1669378165,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646661736664)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x73646661736664"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":25,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d805400000000000000190000000000000bb8000001952980c8806c148d899313d3122971ec8c30c9d982c468e14776afd92cc2ef60738e7dfac8d7b61c87fe390eed5bc17acd0f53216132218ba8f02e26d65d02010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773646661736664","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000075c04686173680200000000086d657461646174610c00000004046e616d65020000000773646661736664096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0xd2d78bb31ef0de3f066f62cdc0baa6a679bbe94fb6299ba6289f69419277a424"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696a75687967746664637662)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x696a75687967746664637662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":34,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9a2b17b1cad5deb3806aec7445de90fd4a7b7d300000000000000220000000000000bb800001df8eaf7c72b13e330536cf44b491dcaf418571153a2af517ea63a864fd4eb7273d894c1b9cd048d15739ba00c18566c397d73a2708e68487f648afb436dfb65010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c696a75687967746664637662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000075d04686173680200000000086d657461646174610c00000004046e616d65020000000c696a75687967746664637662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9a2b17b1cad5deb3806aec7445de90fd4a7b7d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WT5CBV3JPNVTSR0TQCEH2XX47X99XQTCYBG6FJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x0ae0eafd059d69c4b60d90c9af12f6d7929b7e157faa1d49019b3b4ad748d7b7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd493eacad5961065083f56b622791bba64ac0d019ce5b0087500b57fb7ecc3bc","index":86643},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000ae5c8a0f8ca33e7b8fc738abfc82d220766d3b1eaf607c834","index":2408240},"confirm_microblock_identifier":{"hash":"0xf1cdcb52bdb637e581f68c121b095d81a642ef695113ff020ccb4ee03bdae82f","index":0},"pox_cycle_index":388,"pox_cycle_length":1050,"pox_cycle_position":839,"stacks_block_hash":"0xb4ec2ab12ed1c0d5c18d860624895d7269ae13be6c5cee61e2a5ff588e9e8ad6"},"parent_block_identifier":{"hash":"0x3d2d01b132ecee93f77b8b9c8e3ec48f818581be8204799fdc353ff033f2f594","index":86642},"timestamp":1669388211,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364666173646661736664)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":24000,"kind":{"data":{"args":["0x627463","0x7364666173646661736664"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":26,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040082386f2a70a4b57e2d4304fb19364d89d0df04c4000000000000001a0000000000005dc00001c78c2a241d3bd57706bdc30df3832436a46d1f7787786df64b710cb25f1c0bf962cb49544e63976ec7f99463a24608b19ca957866a44a4b5f8f4a5234aac1583010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7364666173646661736664","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000076104686173680200000000086d657461646174610c00000004046e616d65020000000b7364666173646661736664096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82386f2a70a4b57e2d4304fb19364d89d0df04c4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST213GVSAE2JBAZHD8C2FP69P9P4X1QR4RKRFPG6J","success":true},"operations":[],"transaction_identifier":{"hash":"0x68ceb8487e2a4437989f2a2b7f77950b71a3c67784586d4c9062c78c7028d4af"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc32eae2bd9ec54ba296fa5a0c538c099c01a1116993ead53b774a4ea4926d34a","index":87045},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000029dd860521e7874ea315ddc3caea55a52bb64447b706c5bbbd","index":2408755},"confirm_microblock_identifier":{"hash":"0xdeeb3339b2dc2149d0200721b3e138c4f66dc71e348db57f16bf86aafb5f0b05","index":0},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":304,"stacks_block_hash":"0x45748b22831bbbb96e5fe1b030411c0aefe2818be4471bbbf8144a7879efc89e"},"parent_block_identifier":{"hash":"0xd4d12eb2ec994cb7400687ffcd60b0d280dba72797fd3d3785b1494ae32fd571","index":87044},"timestamp":1669615672,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6d6b6e)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6d6b6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400f26d12ce74eb0e6d6cd5427486b6cc90f824c67a00000000000000040000000000000bb8000024aa72f4f0b2474e52ec9fbddd2f2667e9fda2724caabeba3741a31e702ed1831667c360395a7c06012d255fba7c35a405af9995dc9377db549a6686bc6e47e2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056c6b6d6b6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000076404686173680200000000086d657461646174610c00000004046e616d6502000000056c6b6d6b6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051af26d12ce74eb0e6d6cd5427486b6cc90f824c67a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3S6T4PEEKNGWVBCTN1791NPSJ8FG966F9KP46QJ","success":true},"operations":[],"transaction_identifier":{"hash":"0xcb938a1937562adaf7674a5c12938c5cd430d47083e1841c8b3eb8dae5274956"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdef80387def5f53f902597b307b30c7013a4cf0e31e2bb9c8be23aaf3c8d5c0e","index":87130},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002810858ddc1b8e7773faab8b7cbcf3b45a055845b73856eb7d","index":2408859},"confirm_microblock_identifier":{"hash":"0x7aa5329a640afa286735b7ee50a4e9a2ef62cd07c911b20858ff0bc0d09afe91","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":408,"stacks_block_hash":"0x5497f945025d554db397f83d7fbc831b3a9a1851ef0f8218bb463d519ff6b79a"},"parent_block_identifier":{"hash":"0x26a3b851b6beb0aafc701aad18ac2df055cff16bd9746d2418bb8fb278ae805f","index":87129},"timestamp":1669665227,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f706f7568)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f706f7568"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c000000000000000e0000000000000bb800004bc5ba6d6ebdf38dda2aef1218b031449d9df1094c1561f8e5df6e9b1def07dc25cf316637929dc035af9d7e73ca0fa0aa87f7c8231272cda0dec6fb6158e36f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056f706f7568","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000077504686173680200000000086d657461646174610c00000004046e616d6502000000056f706f7568096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9460fab3ec3b8f4d1f962b15e6bf97835ec6798c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":true},"operations":[],"transaction_identifier":{"hash":"0x57dd325807b9a8ad59974b4c9149ecafbbc1ebfcac80f622cb288291af8a4b42"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x930d06db6a4b4c2b2d608cb99eb819490f2b361ba8d57ca8d4425d2867fa5dcf","index":87218},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000021d66850c0e787dc1aa04c7b193586541770d5352660f0953c","index":2408965},"confirm_microblock_identifier":{"hash":"0x69689e6f069b76436569ddf0240efd7f2bac16393e537a1703964f9cb9d92a7d","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":514,"stacks_block_hash":"0x9e0f3a9bba5b229cd2859b0361ac53231b772fcc590656b972b5d105a30d9bb9"},"parent_block_identifier":{"hash":"0x4a4e090f2a257871b3a6e57b1a822e43318e96bb59205589b5b705b64f7a3afc","index":87217},"timestamp":1669720871,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6274636e616d77)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":15000,"kind":{"data":{"args":["0x627463","0x6274636e616d77"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a6bf385c515e6deec564b7973875a66b044c083a00000000000000070000000000003a98000084d04755326e494f4e61d8d9753fca83b1527eaab2411d66524c43dbd383bf1722bddffa67e680e5d9b13c3acb3a94c57dad2e4463d01ee684e5b803021527f0010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076274636e616d77","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000077e04686173680200000000086d657461646174610c00000004046e616d6502000000076274636e616d77096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa6bf385c515e6deec564b7973875a66b044c083a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2KBYE2WA5F6VVP5CJVSEE3NMSNG8K087BZGFQK5","success":true},"operations":[],"transaction_identifier":{"hash":"0xe1ec98c3e55972259d1d5d58fe20a23a68d66ac8eb440123fd3d2e7f6cddbd40"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x550bbd1cff917669681eb701ac8d7f2fb08e1b9f1a05945affca8037289478c7","index":87219},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a83a9a94c0d9f0c396111cf7921c1990ce202f71e60acba80","index":2408967},"confirm_microblock_identifier":{"hash":"0x2a35a2cf1217deb9485d398767970a72ef72daa199ddb16d58e48e69f367530e","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":516,"stacks_block_hash":"0x05fef438a2556325d1a41f997932db293dd529c65c0972a1e1933899e5dd8214"},"parent_block_identifier":{"hash":"0x930d06db6a4b4c2b2d608cb99eb819490f2b361ba8d57ca8d4425d2867fa5dcf","index":87218},"timestamp":1669721879,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6274636e616d77)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":240000,"kind":{"data":{"args":["0x627463","0x6274636e616d77"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a6bf385c515e6deec564b7973875a66b044c083a0000000000000008000000000003a9800000260275ad64eb8df916a959d52f52868f96d8f2046ac844e067dffd0bfabe23421fae475f3b105fb5705b8d35c36355b8c97cb87d01db4ed00493ef0f4e25098b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076274636e616d77","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2KBYE2WA5F6VVP5CJVSEE3NMSNG8K087BZGFQK5","success":false},"operations":[],"transaction_identifier":{"hash":"0x42f850f9877eb13ef7b66733129c08409d28f77f61e408f25213bc0656fd4f9a"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f697579747265)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":12000,"kind":{"data":{"args":["0x627463","0x6f697579747265"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040090a0c8a69c98cc0e7f4109a27d61dcb18e35e55c00000000000000090000000000002ee00001726a5a51e57707c572ee5376d2f93bba8eecb79eb03cfa0f6f58a4c3e46671f81d0a3cb220188620e1c1a9def3f9b56c00c8ae8e110300ae2ccd77ede8094520010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076f697579747265","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000077f04686173680200000000086d657461646174610c00000004046e616d6502000000076f697579747265096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a90a0c8a69c98cc0e7f4109a27d61dcb18e35e55c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST28A1J56KJCCR3KZ844T4ZB1VJRRWDF5BJMDN2ZY","success":true},"operations":[],"transaction_identifier":{"hash":"0x0cab4c7d2ed6a2a6841e58219980375f21448e6f9238145acbd30c9bc6839717"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6274636e616d77)","execution_cost":{"read_count":12,"read_length":43972,"runtime":131834,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6274636e616d77"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400a6bf385c515e6deec564b7973875a66b044c083a00000000000000090000000000000bb800018ef370a9c704b34c6dfb57d2f359e6df3c9d8c378055992ef7dd5836dabfab380f5ec393f280937536341dc4630defd42eb73c47def241cbaeef66aa8359d15c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076274636e616d77","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2KBYE2WA5F6VVP5CJVSEE3NMSNG8K087BZGFQK5","success":false},"operations":[],"transaction_identifier":{"hash":"0x43b738c8ca5d97fad77a0bf92da8c3361f7024af4e0b4b34a515d9f4d2bcb837"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3675196767984ad2ad75c0d788b172b0c7361288e6795239273322936e10d887","index":87240},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001d5b54c16545bb86717042e8f8ae08fb731139cc343e6209c","index":2408991},"confirm_microblock_identifier":{"hash":"0x1505e9f79c93ada0e0e788c7eac695f7776bd8d25537881b00ce82420a2f2115","index":4},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":540,"stacks_block_hash":"0x1508102ef43e3986ae076160f34b78e446abdaafa6daca57c95beb8e0acf1fa9"},"parent_block_identifier":{"hash":"0x1c12fe9a66b88abc188f01907abce143d3c0a9a5e7a95ff2c306a015ff671f0f","index":87239},"timestamp":1669735932,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x747572626f)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":15000,"kind":{"data":{"args":["0x627463","0x747572626f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040025b982a646691c36c336b05ce676a5d416401e2400000000000000060000000000003a980000f8c3dc970379110ac97af6d312cc88b6b6c473cc70c8ea351616769035ae1a4c4b7d39dabd7abf04f58a5b67e7bc247c408037813af9bcc4bf0f3541505d40dd010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005747572626f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000078b04686173680200000000086d657461646174610c00000004046e616d650200000005747572626f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a25b982a646691c36c336b05ce676a5d416401e24","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJVK0N68SMHRDP36TR5SSKPMQA1CG0Y4H0AEY94","success":true},"operations":[],"transaction_identifier":{"hash":"0x3249f2f7a13dff6694d38f66cac0a6e695aafbed4c4ce941ced6360bfd843d89"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x058076f9cb48a47131f4e841d068c0a333a71c2018261118dd3a9bfc0bbe8900","index":87244},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002f22f39e3e8324e2683e851b7ef0cd1b8ba4b77a6ee2ea8b6b","index":2408995},"confirm_microblock_identifier":{"hash":"0x5f6d7744bea3b57f035dbbc76774a53968c79f2306391d01719338db195ec13d","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":544,"stacks_block_hash":"0x8a62187d41f2b3bc3f8fa5867fc2c0af23bcc2a0db1ab99d14449049efdad9b0"},"parent_block_identifier":{"hash":"0x54508b4860a27621b6fa4aa281fd8f9fac47b904b9ded4ec21ec2fe7b2772789","index":87243},"timestamp":1669739059,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6963636865636b)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":12000,"kind":{"data":{"args":["0x627463","0x6d6963636865636b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e00000000000000020000000000002ee00000426fcfe4bdd0fc06b338513f49107f5b93c5eae8196ebf738f66ce98ef83d6aa30010e2c52e9f0bac0ab4e44082f588d6a5ad9393913dcbd09959fff2f244a58010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086d6963636865636b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000078d04686173680200000000086d657461646174610c00000004046e616d6502000000086d6963636865636b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0x75731d518c25b28f183153f4d4c45d5b90faa7166dd049355111cca6decf7849"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3314be03d46cc6439cf85a7d29328276b1dc34e9cd0730ddfc56300c1378f56b","index":87245},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001db1847afb824ae5e225cfbf1f5c9b629cf971d1d61f03810f","index":2408996},"confirm_microblock_identifier":{"hash":"0x1f6458d790f4f618a13956c9ecc19900b8f0b60e2577f573d71d5ed1fe6e939e","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":545,"stacks_block_hash":"0xae983b04a8856f442e2f3b0f1352c92388e2a70f178fe430536e904e1bdf6374"},"parent_block_identifier":{"hash":"0x058076f9cb48a47131f4e841d068c0a333a71c2018261118dd3a9bfc0bbe8900","index":87244},"timestamp":1669739845,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f6f757579747361776177)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":150000,"kind":{"data":{"args":["0x627463","0x6f6f757579747361776177"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040071587055a2f71a657784d9bd4e07bcd8f6a1959c000000000000000000000000000249f000019aec06edb998aefadb575a02cadb574f41f0ab271e9bcd295f15e5b8919a8a6a49a90486c2547369306ddc4ea549fa70e89ab47db5e063dd0e3b90a0b069a7c4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6f6f757579747361776177","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000078e04686173680200000000086d657461646174610c00000004046e616d65020000000b6f6f757579747361776177096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a71587055a2f71a657784d9bd4e07bcd8f6a1959c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RNGW2NMBVHMSBQGKCVTKG7QKCFD8CNKGNFXNQH","success":true},"operations":[],"transaction_identifier":{"hash":"0xbb1f55ae649dad1fe7bfdb6e20f1fd98f6df0bc56e44015916ea1d71b343000e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9ff3d2ac4b739d3c5e5509e1376caf49afde4f8105f4c57323132ce08a72b872","index":87248},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002e175bad14868d48b2c53068f8d7186f1c6bbfd1b1619dffa4","index":2408999},"confirm_microblock_identifier":{"hash":"0xbcab436ffb7969ead2c3547880a1e997892d6ef6a3b08c299b970575e3f58f40","index":0},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":548,"stacks_block_hash":"0x62b2e1b875a502c2ead2c6b2a9005200f4e169d040c7b5e81e31432b9b512f1a"},"parent_block_identifier":{"hash":"0x7dfc5519a62b0fbf1ca1a5c9a44720cb1cb3bb4e3977d5518032da05cece23da","index":87247},"timestamp":1669740872,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a7662686a626a6862686a62)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a7662686a626a6862686a62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e00000000000000050000000000000bb80001fcc460d250339a2552808d6291cc2a14eeec9dcd491f03917db686ff3efabc892a313c651ca5269db9c8f61504b7e387a346e80ba3cecd44d5b875a2d60534c2010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6a7662686a626a6862686a62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000079004686173680200000000086d657461646174610c00000004046e616d65020000000c6a7662686a626a6862686a62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0x949a63592b1db411f3ea28d8e64f2bfbf5c96666439d169d5cadd998484ea382"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8aa6774eb2d409727be43c666735d43410b054d60b3d2d4862847ad19c524b93","index":87252},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000ba57127a6cac89bacb165fbe3abf91f88f83a1b07156de53c6fc5c4a","index":2409005},"confirm_microblock_identifier":{"hash":"0xcb1753afacf469af6ae873967fbf07542e203180472af9107a53780ada610ffd","index":3},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":554,"stacks_block_hash":"0x3bdb497d464e6838fa1e38ee0f920d86a21a7a9db1ecf48b8eb1b727cbeb99c1"},"parent_block_identifier":{"hash":"0x93f5d53f0061b897726d200f42497a100301e592a4c4ed3390806aee162faf75","index":87251},"timestamp":1669742887,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x797472657374)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":15000,"kind":{"data":{"args":["0x627463","0x797472657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e00000000000000080000000000003a980000c9670a94c51942ec6a04e3ef341a21a6d04e5b5062a5a8d17b1dca805fd07e624cddeba0d036ecd045d58e10ee93af7e3d730827f9a44e559c64b2fbea8a6890010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006797472657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000079204686173680200000000086d657461646174610c00000004046e616d650200000006797472657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0xc095346d1fd8b0cb2e1ef4837f808ec66d000896d9158cf761846ea2b64ede64"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x29bf942dc23418306234d20442c902802bc0eff0b91df3abb80005f0424a730c","index":87256},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000698162d3e74ebcb3159294b2a760d8df1cc3cc12c0e363186","index":2409009},"confirm_microblock_identifier":{"hash":"0x185d06c06ed3e626b8cecccb76e16dfe322eccacaa4534f0255eb6ab337d9580","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":558,"stacks_block_hash":"0x377062d64ee23bf19c163303ae41ad53b1ef1576938ffb71cf9b1e9ecc29497c"},"parent_block_identifier":{"hash":"0xfb90a49e83f0b3894eca648695443ddc341ab97de57df09b8b0fd59dbb484a04","index":87255},"timestamp":1669746021,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x78637a7876626e636d6777)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":24000,"kind":{"data":{"args":["0x627463","0x78637a7876626e636d6777"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e000000000000000b0000000000005dc0000143897c180562a9c8c6cb04c82843d9a6fe7a10434d1f3dd7cedac4d8612a2a9831057d4b06ddd95ca323c424e3aa59b8e40c656cbcbcb13ebb23ad383a53a415010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b78637a7876626e636d6777","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000079704686173680200000000086d657461646174610c00000004046e616d65020000000b78637a7876626e636d6777096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0x8f3828f6e2dc3983ef491cd8cc71165d7d46132b9d7ca13d8b0ba24a17506ec3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc1aa9cb983ae782e273a86302a30d599700f2944233ae1f5702420370758f0c1","index":87267},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000c614857d477c922ca77b674243ab6ea360f45abfea5375fd4c7fd6eb","index":2409021},"confirm_microblock_identifier":{"hash":"0x37238854af13a77d9c966763cdb61e7ea5e805d66b1249da1c62bfc1a3f8d25d","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":570,"stacks_block_hash":"0x8961bacd513b01cd3a8ea1d51c6ebc7f6a3c71d5f5a394de55b02f8bca827b39"},"parent_block_identifier":{"hash":"0x8ae0833e3863b5236f210c450ab4d9e4599c14ce8beb47b58f7edbd1d55bfe2b","index":87266},"timestamp":1669750733,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6975797472657361647863666776)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":6000,"kind":{"data":{"args":["0x627463","0x6975797472657361647863666776"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005d35a7e8d4600d0285ec0b3a97f764c750e415d4000000000000000000000000000017700001d8ee7b28b8fd3003b18955215dfc43ecd3fa93640be65bc9b65e1fa93ec830cd19f933b8ff63cd2e3ea831da78299b28fc3a4a51d0e4444283f7750112697841010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6975797472657361647863666776","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000079a04686173680200000000086d657461646174610c00000004046e616d65020000000e6975797472657361647863666776096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d35a7e8d4600d0285ec0b3a97f764c750e415d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKB9Z8THG0T0M5XG5KN5ZQCK3N1S0NTJ3R9R4W","success":true},"operations":[],"transaction_identifier":{"hash":"0x036a4e5cc8f942c62a69d059084ba793e43b0e333b606d578e7c783ecd4f3fd5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x45e01bd8abc8d7fdf45f1baa727234500f6ee2be3c449e3f30612a86b3e39c4c","index":87272},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002a1c7bb094b9330bbfdfe2928bbba3f63b8ac56166edfb7b99","index":2409027},"confirm_microblock_identifier":{"hash":"0x4ca7ef482aa50380f0d9573545cb7c32789f32aa0bf09a9fda9a6df2ad6f02ed","index":4},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":576,"stacks_block_hash":"0x9df1d0922d5ff5b20975f1eb3597598e280be1e57b2816c1ba86ae17227ceb14"},"parent_block_identifier":{"hash":"0x2eb19cc47a9d808a3865b9deb67b8d777d670c00b1e3b5d79ac895f7183f02ef","index":87271},"timestamp":1669754689,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004003da601439aa4bd4a6c3181956d05322fa915211100000000000000070000000000000bb80000fa47d0e00c4a429a3021d7927ff5c10cbe0adfc9c00442113cd59aaf53ddb93a7a9a8b477698db7c00d0ce6ca7d4b6e9962bd3ba7ae15f363fac217ca75cb218030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000079f04686173680200000000086d657461646174610c00000004046e616d650200000006646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3da601439aa4bd4a6c3181956d05322fa9152111","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STYTC0A3KAJBTJKC660SAV8568QTJ59124HYXP5R","success":true},"operations":[],"transaction_identifier":{"hash":"0xfa55c052bc334432d242812f34e397d16c48319bb6562c3d6c1088d84b2c28e7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x852fde1cc3d443bd83b2b4e4f139c9ecf12e08ca2e9eb6d19dec178e2622a696","index":87275},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000002206f15c09d9d9750d1f2bf5520302e7bd0dfff44ff46bc5a3c2","index":2409031},"confirm_microblock_identifier":{"hash":"0xf40a6d82c99d8d85c426252b6964dfd60d783561238119802481de0e983734b0","index":4},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":580,"stacks_block_hash":"0x4dbeafae344528350ca95bae4ba3d46680363d184da0862db80d702acb127e99"},"parent_block_identifier":{"hash":"0xf608cb8e93500e8abb621efc04dc6946f786e7ab04fe59112ae7dbd5e62fccc5","index":87274},"timestamp":1669756282,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737464)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x7465737464"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004004f3acca619f08db7d1908d94fa8caea9b267be8700000000000000010000000000000bb800016a61508d840532f20aee34290af5d4479d024059b336eee820f44812ac85a4c726798cb75038bbaa972cb7c871d28d194cb9ffb06372ddac986bbc27b4107982030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057465737464","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007a404686173680200000000086d657461646174610c00000004046e616d6502000000057465737464096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4f3acca619f08db7d1908d94fa8caea9b267be87","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST17KNK5637R8VDYHJ26S9YMCNTMV4SXYGW42YG81","success":true},"operations":[],"transaction_identifier":{"hash":"0x9997f3d38b76434fc0c9e1846619ab7438bdc4cf317c78da919b525640603547"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x44ccab45fd3019eb5113aa992554fcb7242c2a2eff21e520dd9f063b53c9f3a0","index":87282},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001805a52975eee1cbe39d8345ad8398517cf7c5a6dbf7592007","index":2409040},"confirm_microblock_identifier":{"hash":"0xadeff9820a06c1faa8c8ee0b7e86f3b621ffdb36032aba82df7eac2621ee2d67","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":589,"stacks_block_hash":"0x1b92a26ee2d0a31fb07a18f05ba597ea97c6a662a2e6fe294a24f13c66259057"},"parent_block_identifier":{"hash":"0x04593f45e3299a2385c75fc3abb11ac71665422e7c5426a7691c74f4a27dd509","index":87281},"timestamp":1669761829,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63736b6c646a766263736b6c6a64)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":75000,"kind":{"data":{"args":["0x627463","0x63736b6c646a766263736b6c6a64"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002f7ebdd66c450524da9ad9136daad7a982286555000000000000000300000000000124f800007a017248363577263c1bc9a0de3619009bc6a93a3ede31b35c7e3e84281ed07729f0b01ba21627a321e9165e5fbc9e980b92278c5a1bd8a7d7788480c59ed330010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e63736b6c646a766263736b6c6a64","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007aa04686173680200000000086d657461646174610c00000004046e616d65020000000e63736b6c646a766263736b6c6a64096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2f7ebdd66c450524da9ad9136daad7a982286555","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STQQXFEPDH2GA96TKBCH6VDATYMR4A35APHCS7Q9","success":true},"operations":[],"transaction_identifier":{"hash":"0x90d74b07ac0882286f7cdc4180edf29f3748806bc186ce788d8650fdc3a277c0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63736b6c646a766263736b6c6a64)","execution_cost":{"read_count":12,"read_length":43993,"runtime":132016,"write_count":0,"write_length":0},"fee":15000,"kind":{"data":{"args":["0x627463","0x63736b6c646a766263736b6c6a64"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004002f7ebdd66c450524da9ad9136daad7a98228655500000000000000040000000000003a980001b4eb72ab3000321a0ec7e44d8b96418ac98a8eee67b38a039986df91ae5e4f9120cffb286d6d7e7b4c2ed81094b5e83cc619d9377b8143e6bbcc2823ae7281d3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e63736b6c646a766263736b6c6a64","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"STQQXFEPDH2GA96TKBCH6VDATYMR4A35APHCS7Q9","success":false},"operations":[],"transaction_identifier":{"hash":"0x01f64217ae4a64871ff87a6299488e0f14172e2b15f137ba3d0d449f0d37b497"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0c97b76ba4cf3509d53736c8601fded00940d15eca0bb02cbd47371695c282af","index":87284},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000324ec8f9e38679853f82097096e249f0b16ccc593de5e22280","index":2409042},"confirm_microblock_identifier":{"hash":"0x456e0b31eb7802d2ba4f3e7614f1b00e2b4899fabe8ca354a8e32d70a0ebb912","index":0},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":591,"stacks_block_hash":"0x26efc3132b4e6664eb3726cc77fe341fa7ce2096beac061b53dfe34117812a5a"},"parent_block_identifier":{"hash":"0x15d1393db590aa5a004a851eb817caf44bf26a13cd9ae592cd108368a4417f44","index":87283},"timestamp":1669762393,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x63617363736363)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x63617363736363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":28,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040009c5ad860cb9f2d893abb2f9d692c402474d8054000000000000001c0000000000000bb8000189ba354ecf1b96a2b86297d2708759699022e9d694ccfe3f02d033e08f242cfa155f7bfe53f219700bfa48ffc874d500eacdab9ec626106d5677dc3d7f07a900010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000763617363736363","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007ad04686173680200000000086d657461646174610c00000004046e616d65020000000763617363736363096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a09c5ad860cb9f2d893abb2f9d692c402474d8054","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST4WBBC61JWZ5P4KNESFKNMJRG14EKC0AK7BVJSX","success":true},"operations":[],"transaction_identifier":{"hash":"0xe7be16eba5841b2911109031f3749e07f8e20df497f6bf89465406eb09920650"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x78bae2c906a16dd9db8d44f5fec17b818020260f3ae1c6d08ff915aa846bdd15","index":87285},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000294ca0a1e4e352ef7ed9e9080472086f6aa6f20cda625f9f533c","index":2409043},"confirm_microblock_identifier":{"hash":"0xbf6c5dfea57593ce0dfbc252d0fe570820d2b79e1aedd83852b49f35ec3781cb","index":5},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":592,"stacks_block_hash":"0x49457c5ed2456c0c50749d885e8a45a0982bebcfd14f056c683c30a543d504b6"},"parent_block_identifier":{"hash":"0x0c97b76ba4cf3509d53736c8601fded00940d15eca0bb02cbd47371695c282af","index":87284},"timestamp":1669762706,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x69757974726577)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":30000,"kind":{"data":{"args":["0x627463","0x69757974726577"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c59ee6ff16df50b45f7888a159b22835ac6db98f000000000000000600000000000075300001f69172780d8dc1042b43f5d15ef437ff4f6cf73f25e14b2f47c666759c6f21cb5685d287918c8598136e5d47abef994834a163c961773b1808eeb43c202f31f3010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000769757974726577","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007ae04686173680200000000086d657461646174610c00000004046e616d65020000000769757974726577096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac59ee6ff16df50b45f7888a159b22835ac6db98f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32SXSQZ2VFN1D2ZF24A2PDJ50TTRVDSHX6W32MG","success":true},"operations":[],"transaction_identifier":{"hash":"0xa6c572c49ae0fe966268214e945627928df7471584f0792c8102bad7cc54ba90"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcf12cd22da8fbcf691e494b0dfdbdc9c7c63734e643ac3b59bde05e05621c1c8","index":87286},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000040eab398a7e143ee8c993d7f849ce87a98fc0762ee6dde82ff","index":2409047},"confirm_microblock_identifier":{"hash":"0x43678d1475d9d9c23d304682132672206c3265ec079d5db85e57aa51fcf20ccf","index":5},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":596,"stacks_block_hash":"0x781722b21b77b2a7c17ef4bcf0a0bba08cd9900b094888dc05485dbe3f525870"},"parent_block_identifier":{"hash":"0x78bae2c906a16dd9db8d44f5fec17b818020260f3ae1c6d08ff915aa846bdd15","index":87285},"timestamp":1669763909,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f706f7069757575)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":15000,"kind":{"data":{"args":["0x627463","0x6f706f7069757575"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e000000000000000c0000000000003a980000af69f21acce45f0823fc921f978e5e27bb5e1b79a6893142845ae2f25a17345125d712cb0333a4d72ab1de3847cf86352bee3c38ceab0dc5496a876a9d0e51be010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086f706f7069757575","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007b104686173680200000000086d657461646174610c00000004046e616d6502000000086f706f7069757575096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0xd447f895f67dc2411aaa386b1ed1dca7bdbeb8206a7ccf72398f83d55c3e4adb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc47f80349151a9f4e075713cd6f280e5c8904734b168efeb5b5b4632d9ed6ac4","index":87333},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000003b2e29df8a6876f44fd9a4a632d15c460be885d31be406b490","index":2409102},"confirm_microblock_identifier":{"hash":"0xe2b44282d1285605283083aee4a23f4f901478b5a7956a5ac3f47134c42751b1","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":651,"stacks_block_hash":"0xb6116566303325698339bc4a9e45491aa393e717077a68a202ed73c25736dad6"},"parent_block_identifier":{"hash":"0xa02d6a223609d30f60197eb2bb2ff5fd1601c6f9be07f984d9462c0d02e39b12","index":87332},"timestamp":1669796276,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f69686a626a6b62)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":15000,"kind":{"data":{"args":["0x627463","0x6f69686a626a6b62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400348a3799c6e7d92dba88a9820460437bcabf02c5000000000000000f0000000000003a980001a8d1730402d6d9c36ff8ab1996980af165c0d0dceeded402adc78d30853b17de0e4403d34378f47d73cec4bbe5b498f896d0e42bc064d9d6aa6556208382224a010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086f69686a626a6b62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007b504686173680200000000086d657461646174610c00000004046e616d6502000000086f69686a626a6b62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a348a3799c6e7d92dba88a9820460437bcabf02c5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STT8MDWSRVKXJBDTH2MR41308DXWNFR2RP2D2QKQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x39c93a70fd34889a73dd7cb2b84d08a59ccac2f8702174fcaf3ee7e96d17421c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcf14ace546c99e7e94ee99c88e28d7dc4672eda1797cc1e9abdecdf195834b1b","index":87337},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002811e882541c49f5731af8c36a9af10b85bcb04b5ac6b9828f","index":2409106},"confirm_microblock_identifier":{"hash":"0xcc23185b12edfb77cbd100976981d60bbcc71042a3e4e52a739054b23ba35329","index":1},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":655,"stacks_block_hash":"0x738ff1dc7e4ccc51ea768e4b869c71364b22b8df67f4a8be4e505928766bfbd0"},"parent_block_identifier":{"hash":"0x21903503a2c274b8ab77ff0cdd678e08a92f115c9af2400cf32a4cec5149fd1f","index":87336},"timestamp":1669799082,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x612d646f6d61696e)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x612d646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":45,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a8000000000000002d0000000000000bb8000123ce1a53098a32ba6f2f4d71016add2fe717804ad9d5d9188a29bffaf554f1ef73d4a61722c5975caa30c9c39e75b3abec993888f6e47bc43e71c30ec1ea08d3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008612d646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007b804686173680200000000086d657461646174610c00000004046e616d650200000008612d646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x2d9728d6a004efe4e6b814b02ab49cbefe4b59bca09468a0bd871c9c41730632"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x51ce4761b2169f3fdfec73e574e832c0b09dadec7bde35f22a0fb6f29d02e6ad","index":87347},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000bd7810760ad91c48105052635f350362fe642f3d703d549e67f86cb2","index":2409118},"confirm_microblock_identifier":{"hash":"0x4e28b3aa8c5a18f6971cf78406aad8e9fc5bda62a232812e3617c50bbcda9697","index":3},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":667,"stacks_block_hash":"0x6e4a0026c19fc28d4a2fe51690d81f0b4c7a84916987ffa1ae658925eccb02d5"},"parent_block_identifier":{"hash":"0xe52761ffc0ae45216dc03f622024cd707b657bc53f45521330888cf18788edcd","index":87346},"timestamp":1669806214,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706c71636e6e)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":75000,"kind":{"data":{"args":["0x627463","0x706c71636e6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004009460fab3ec3b8f4d1f962b15e6bf97835ec6798c000000000000001400000000000124f80001349648513c4fc58d0ada0a97539d3d6714c0ca5057cac47aa2e891e329208aad51c472805498cddb25b1d0bd37dd3fe12aad68258305737cf4e9f925eef4a5ec010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006706c71636e6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007c004686173680200000000086d657461646174610c00000004046e616d650200000006706c71636e6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9460fab3ec3b8f4d1f962b15e6bf97835ec6798c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2A61YNKXGXRYK8ZJRNHBSNZJY1NXHKSHHWF4X1D","success":true},"operations":[],"transaction_identifier":{"hash":"0xe895bf59aa6b54b515cf090a88433e448e693d147790765ce19804823d57f845"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9ebd8261edde2023c2c0e909470615eb2ae6498f570f7d3d21a53b6459eceb17","index":87350},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000892920d2a2f716d8307d7c319d76b1ca4803e750aafda0cf19fa874d","index":2409121},"confirm_microblock_identifier":{"hash":"0x74d8ea9f233dab761f46f765389123cc393a929b4be6eb0b4118ac41cae8d309","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":670,"stacks_block_hash":"0xc6385dab991aa563ac5b5833d2307c23cfdccd94b9c4eac3c949ec44fb9f5237"},"parent_block_identifier":{"hash":"0x30f1b436b024ec6aba4fe856f5b140d7d12046cb06e0e489d9b5a8eef7155d03","index":87349},"timestamp":1669808323,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696a6f68696f69)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":75000,"kind":{"data":{"args":["0x627463","0x696a6f68696f69"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007075c88ba7e72f517b90acd5d6bbc7835e17019d000000000000000000000000000124f80000fa05b35fbe62fdd2a0aec73e796761e4632abee15e5b6253b6189893ceac0f60060f54286842e294ffaa70ec2a99e79bddbba66707ab960f911047902c6cf1bb010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007696a6f68696f69","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007c104686173680200000000086d657461646174610c00000004046e616d650200000007696a6f68696f69096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7075c88ba7e72f517b90acd5d6bbc7835e17019d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1R7BJ4BMZKJYMBVJ2PDBNNVRY1NW5R1KPABFN83","success":true},"operations":[],"transaction_identifier":{"hash":"0x5591293b4c87a1487e1f236de59df5363a08878ebad193a7a1249b321ca9ae86"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6173646663787a6275)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":15000,"kind":{"data":{"args":["0x627463","0x6173646663787a6275"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400e2c8eca76a6f40a2e6c41c02c4333c353e8e888500000000000000000000000000003a98000070a2967166fbdb13035dad7f9d66a18cd5769bf23554850136daa1c4b47911f12b8ea5265dc8e988f9675bfc5e5c912c7b27e9834b3a82b1e9c7ce478120ae9b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096173646663787a6275","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007c204686173680200000000086d657461646174610c00000004046e616d6502000000096173646663787a6275096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae2c8eca76a6f40a2e6c41c02c4333c353e8e8885","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3HCHV57D9QM18Q6RGE05H1K7GTKX3M8GQZS28J6","success":true},"operations":[],"transaction_identifier":{"hash":"0x1ca7e12a12ec862bea9dee5009baa01f10bbf63134059c9162a8266c83860d38"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3d73e6fb7f950b95f77d70cdd0b12fa26d5e0e377ef027acac06bcdeacef4490","index":87354},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000121886a8e858db11c3fdc8733ecf3ec8175fb1c3bc9335a985","index":2409125},"confirm_microblock_identifier":null,"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":674,"stacks_block_hash":"0x6bfc0762074e2d414933e9a79b2b920081c6d810e1294114a58f31e4bf85e752"},"parent_block_identifier":{"hash":"0xae32b383886fe2f366a19ca26b7b2c2fbc7d786b91c2acb3f5c1da719321e3a7","index":87353},"timestamp":1669812090,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73667177656663)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":75000,"kind":{"data":{"args":["0x627463","0x73667177656663"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008435c694e51024d978ea3fb42971d74b8ff3df35000000000000000000000000000124f80000329b294c2d876293bad6fb3a00421718c5133b2506fad865aa4a8e73c79fab382277fcca27994aa20432eefe60192e40c9b05593358ea2a1bdeade1eca5816bd010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773667177656663","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007c504686173680200000000086d657461646174610c00000004046e616d65020000000773667177656663096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8435c694e51024d978ea3fb42971d74b8ff3df35","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST223BHMMWM829PBRX8ZV8ABHTX5RZWYZ6PTJCWC5","success":true},"operations":[],"transaction_identifier":{"hash":"0xd961a0345c6085e30086d5e4926554fc3fa1ab3bc22aad50e36d2eafbdd34734"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9e6cf500ead62b34abfd887f46bc4fb06ca2a3f6ab6128e2f1de602a7d23124b","index":87357},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000622dab80d78e53c886d889acf51752cb74f682f7b53a028f4cfa57b5","index":2409128},"confirm_microblock_identifier":{"hash":"0x3ba8f9bd43005ebea0b69a3c8c19538df0c8c68040dc6fc82be05b280d8dfe8f","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":677,"stacks_block_hash":"0xbd44c97b66abe8d8ca4743ad405125d90fd3cbbbe7de305ef630fec49d2a7c89"},"parent_block_identifier":{"hash":"0x634667f62283b75399effd42993bb0c30a45f889ac41d3c26e609905a2475e12","index":87356},"timestamp":1669814589,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73647663637a7672)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":6000,"kind":{"data":{"args":["0x627463","0x73647663637a7672"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e2c8eca76a6f40a2e6c41c02c4333c353e8e8885000000000000000400000000000017700000cc8d21037ab0bfaf738f3ae232285c8a71a029ec77bf31d71efeecc2e839a9ff0bc172c57ba5d5626792c04e462fa6a3c18975846b94d566f3f70b087cbe1527010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000873647663637a7672","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007c904686173680200000000086d657461646174610c00000004046e616d65020000000873647663637a7672096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae2c8eca76a6f40a2e6c41c02c4333c353e8e8885","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3HCHV57D9QM18Q6RGE05H1K7GTKX3M8GQZS28J6","success":true},"operations":[],"transaction_identifier":{"hash":"0xb4612c94fb610ff7a8edac2a2de99413b17ac950c24d76ff75779653ded8dfec"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x28c099f086b07e89575e050fda5edbbc39a49ee8fb30b811260890d8ae343cbb","index":87358},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000df75cc125c0b368b1448efe7c3e99d03b8b561c4e0c6e8badc37","index":2409129},"confirm_microblock_identifier":{"hash":"0xcb719ec609a31a8fb32f462ac8bbc070c88ea938cd2b7b18c5cd5378d66de315","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":678,"stacks_block_hash":"0x0588f6ac17759c1a9494044fa7c794507d0880d180d83d3c3917b808d4da2820"},"parent_block_identifier":{"hash":"0x9e6cf500ead62b34abfd887f46bc4fb06ca2a3f6ab6128e2f1de602a7d23124b","index":87357},"timestamp":1669815794,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617871776563)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":6000,"kind":{"data":{"args":["0x627463","0x617871776563"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400d5c6df928e2d295d44682c942c230f42ce64f56f000000000000000000000000000017700000d1db496883db73d1c35aff5888c039b5b54b2b29ec0c5fc05ea7a6b5dc9b870d586f782497dcdc83d75574faf19f7b9636fce8e44ea61c5779d8e1639a86970d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006617871776563","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007ca04686173680200000000086d657461646174610c00000004046e616d650200000006617871776563096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad5c6df928e2d295d44682c942c230f42ce64f56f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3AWDQWJHRPJJQA4D0P98B131X1CWS7NDW9X3S18","success":true},"operations":[],"transaction_identifier":{"hash":"0x6dc857eec4435d0a53557c1cbf8b042e7e9b0f4ad1200093a838f77dce5de726"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7f81a0e03800f0718e2fa6765b4ae348eb6c4212028add1049e62a58deadaaba","index":87367},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001b2e217482aa8428140f1759e1bdf160f1eadb2825e5dd588a","index":2409138},"confirm_microblock_identifier":{"hash":"0x636982798acafc39e2c8ae611d3ee5df1ffaaf57e16256e98bde40248e281730","index":2},"pox_cycle_index":389,"pox_cycle_length":1050,"pox_cycle_position":687,"stacks_block_hash":"0x57261b0e5645b1ad341d7e1737ab625fae17300bd80ed7ebc89c379a0957641e"},"parent_block_identifier":{"hash":"0x972b4e168d5faa654ad8f7e99e5bd2144bf9a546ef1fa5c01e021cfa063bc40e","index":87366},"timestamp":1669823277,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e65776e6f6e6f)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":6000,"kind":{"data":{"args":["0x627463","0x6e65776e6f6e6f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004000655085431e875f55cfa5b60581b22d9a623805800000000000000000000000000001770000062f528406a7159f46b4621bd694276dc89ebd89907551204285dcdc76e403532394acee7d8f012fc42d72530bb984dca71608539e5afb59889428a9f043c344f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e65776e6f6e6f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007d404686173680200000000086d657461646174610c00000004046e616d6502000000076e65776e6f6e6f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0655085431e875f55cfa5b60581b22d9a6238058","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST35A22M67M7BXAWZ9DP0P0V4BCTC8W0B15WRXMP","success":true},"operations":[],"transaction_identifier":{"hash":"0x392dbd60a3320b66148ce75050312defe205ab42673e1167620076c5c2578daf"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa2fd784f753dd275c69a60a51e36f4c1dcfb39f7fb759e6df0033bacfb0c571a","index":88293},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000048947af3b196adbb65c543a2bad71b8c1bcb11a53365b6fd5ae4","index":2410213},"confirm_microblock_identifier":{"hash":"0xc9e5818e1b46bc96a26eeed24c5c2cc689db75092d2b86f609efc582dcb8ab66","index":4},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":712,"stacks_block_hash":"0x45a802dee1919813f742cc9634bb7eeb2912d9e54154a256fec4525a0743ac9b"},"parent_block_identifier":{"hash":"0x10f4545ece0473a43ecc22c573afecf655add3608b0b01108abe0af213085619","index":88292},"timestamp":1670419075,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617378716364737861)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":6000,"kind":{"data":{"args":["0x627463","0x617378716364737861"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400e2c8eca76a6f40a2e6c41c02c4333c353e8e88850000000000000008000000000000177000017a7473a58f8b407eec2fc6ded9ba0b76c2dd5d3a2fed2456bca7054707be3a6248b1c6c5f8b589f804a81d01aaa48a0af46c47d1d5e946e86ca6edfa5f482f69010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009617378716364737861","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007dd04686173680200000000086d657461646174610c00000004046e616d650200000009617378716364737861096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae2c8eca76a6f40a2e6c41c02c4333c353e8e8885","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3HCHV57D9QM18Q6RGE05H1K7GTKX3M8GQZS28J6","success":true},"operations":[],"transaction_identifier":{"hash":"0x517421812cc1d3e7bd47d679c9f387792ea2324d1fc70f6e8a7e5e8ca3d055d7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x52b9753abdd2bb9d18052f5359584024a99d2a0465996265b821f3e6aa4f6a00","index":88294},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024f820e201aa815444fc46e638da9cc645e23b4bd17f741f1c","index":2410214},"confirm_microblock_identifier":{"hash":"0x25bc51f2515130e7ac60843efdc59c1ba23d4273a103ea49ffca4036a05c77e1","index":0},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":713,"stacks_block_hash":"0x53c195a80b8c108fd59014445ca0287cd4ac9f1650c504e77a20093fc7f4aedb"},"parent_block_identifier":{"hash":"0xa2fd784f753dd275c69a60a51e36f4c1dcfb39f7fb759e6df0033bacfb0c571a","index":88293},"timestamp":1670420276,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e65776e656e6f)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e65776e656e6f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004000655085431e875f55cfa5b60581b22d9a623805800000000000000040000000000000bb800016980ba2f59dd603e3261b578eb466a32da5b602eb60c55986b2e648ea2d063da192e88382f8f0e1c9a2487bc5fe8a9a3c1dd8573628a0dd8c5fb50eb7f19885b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e65776e656e6f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007de04686173680200000000086d657461646174610c00000004046e616d6502000000076e65776e656e6f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0655085431e875f55cfa5b60581b22d9a6238058","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST35A22M67M7BXAWZ9DP0P0V4BCTC8W0B15WRXMP","success":true},"operations":[],"transaction_identifier":{"hash":"0x4736f394e161b9600bef1f30053f1b64ad2448fd7c25ca4c6a789aab7949e95e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5508175049479761ec12e2cb31ac5d08ae85748e0308ee847616b485725efa5c","index":88395},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000010add23de4c09b7a1f97f899ac174eb06bf08889fd25d251c1208","index":2410332},"confirm_microblock_identifier":{"hash":"0x26a134e2c579ba4cf479ca55160fc390d8aa589a8b92769c94e079143e5ce869","index":3},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":831,"stacks_block_hash":"0x69dccb2f282e276b2c5d230181284c812762aa34643c7e7de09120cf19c1d717"},"parent_block_identifier":{"hash":"0xdebc8b50ec399d17d5a3a2f398699183013e545b38723b7fca4f1e712d391ce7","index":88394},"timestamp":1670481000,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a78617371)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":150000,"kind":{"data":{"args":["0x627463","0x7a78617371"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d4000000000000000100000000000249f00001621742fa675a0a27d64573822b7aa36cfb9ae794ad431ea105e64b1edc29a1394c7c7d6254799e938ca20818d4fe442b644636a8709bbe764050dad4c05d17af010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057a78617371","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007df04686173680200000000086d657461646174610c00000004046e616d6502000000057a78617371096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0x4e9d86125227329aee81c4c57030cc14004dcc4eac821ea67e35f401f6edcf8c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1c67c432198fc71f26ce0b2450bf88f64e3364db4343c125eaacf0249cd62e5c","index":88521},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000079c43c2f30ee0b2c87c869a303a1534bb5fd30a82134888b1d47","index":2410470},"confirm_microblock_identifier":{"hash":"0x0411f56179eb2ef048691113742f90ea90df6ae9936800653d0173bd7462227d","index":1},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":969,"stacks_block_hash":"0x014de78fbe8fb3159dce44e87b86980ca81de2ec82228b29ebff92924272814b"},"parent_block_identifier":{"hash":"0x447bd1e029b92122d15477094b311d82d58182a2049247f987366ac71ffcbae5","index":88520},"timestamp":1670565488,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636f6c6479)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x636f6c6479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d400000000000000090000000000000bb80000c46aa34d091a94d8d8eee14a1da382e62867e34e000aad3e7e7fed72abb7acc90c8d9d7dec8d33d8a6f33eee87f266665215961619381e5ad14c8c9d4892bc0e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005636f6c6479","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007e704686173680200000000086d657461646174610c00000004046e616d650200000005636f6c6479096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0xc74e707b9beee62eb72f79196f03511c391f31be593e8504f768de7fc4d015eb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7496ef2aee69b1cdc9b53c5828d8ed71d382f3f5b267d589be2200fce169cae2","index":88529},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000122e6e2b883c132d661cf094277ab40c665241fc77468f13d4","index":2410478},"confirm_microblock_identifier":null,"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":977,"stacks_block_hash":"0x7878010ef01f2695172c1cd48c2740a2c902340a18748455b6e74bdb67fc525e"},"parent_block_identifier":{"hash":"0xff7afa2f9b3c54d141349f5bf3097e738f9a85e66276efb0cb8988dcaa03e79c","index":88528},"timestamp":1670570106,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f75797472656466)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":15000,"kind":{"data":{"args":["0x627463","0x706f75797472656466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008435c694e51024d978ea3fb42971d74b8ff3df35000000000000000b0000000000003a980001ce348ad3e5b51edf43697fa66f1b69fbd0d18005bb2a2fc9dfc84d0591c9772d0ff4a9aeaaeec0bb300d0cf6b96b4708b1b28f01fc160c24c6cb751f3e8ceb84010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009706f75797472656466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007eb04686173680200000000086d657461646174610c00000004046e616d650200000009706f75797472656466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8435c694e51024d978ea3fb42971d74b8ff3df35","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST223BHMMWM829PBRX8ZV8ABHTX5RZWYZ6PTJCWC5","success":true},"operations":[],"transaction_identifier":{"hash":"0x4bb7099dbf56397b2357f1267ce2b9ea4343110810b80265b1364c859c6ae905"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xab0ca18885d4ca36360242af217bf92d39ca748602b22a97daac1ab7a0a1a33d","index":88537},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002bf278f8745ff24b89bcb843b9d8c88f1bda30c364ba51a827","index":2410486},"confirm_microblock_identifier":{"hash":"0xe6dafd33969bd16123f33266709f0d9a3a35b18e04644ffb1eb0eec379e367d2","index":1},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":985,"stacks_block_hash":"0x8f179e960580d9815f3e0149358e0004e79f80533f83b3690cb9468dfb1703b9"},"parent_block_identifier":{"hash":"0x319b9328cc849ec3b00f50d96f192eaadf3a2fc84ebcf3f7b2d7507694e16b39","index":88536},"timestamp":1670573614,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x657177646173637a7863)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":15000,"kind":{"data":{"args":["0x627463","0x657177646173637a7863"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004005d35a7e8d4600d0285ec0b3a97f764c750e415d400000000000000040000000000003a980001bac2b28fb30179abbb0b62cbe0f6809481bd3a76df6901d2e2570907a42f9bef795059dbfca503682794b3840b0bf1d0066754050382bfb12419a9fb23da779f010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a657177646173637a7863","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007ee04686173680200000000086d657461646174610c00000004046e616d65020000000a657177646173637a7863096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d35a7e8d4600d0285ec0b3a97f764c750e415d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKB9Z8THG0T0M5XG5KN5ZQCK3N1S0NTJ3R9R4W","success":true},"operations":[],"transaction_identifier":{"hash":"0x4abeb515fd63d0121d4bb4419ef4d4f7601701c10feac14e132e9f397d555e92"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x41a60ec51a29de5da45fa8a6b2d45a82a3a051165b8744ee8a01a7c31c919e06","index":88542},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001364b0745f378d1e59d2de6054d8f67ec4fb4d3e30ee979789","index":2410491},"confirm_microblock_identifier":{"hash":"0x2eb851788db2fe46e7cebab6044756c8b6c0e5e6774178931529c1e05fedc7ff","index":1},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":990,"stacks_block_hash":"0x61362c2b84a75c77f5929bfe928fe687f2ac62dae83cb77b47d43fa17df9a316"},"parent_block_identifier":{"hash":"0xfefc1da7c556b809ebf2c91795fbb009da429918f0ed85ee84de72764229ddc7","index":88541},"timestamp":1670577257,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f7069756f796968)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f7069756f796968"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d4000000000000000c0000000000000bb80000b680973848c73ab2b094b8bb5a9bfa6c671fdbe5a87074600c169b1652761338640b6aa7a06fe667b799fdde5733d918091ac9fffbf267006c3030fca11ed919010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086f7069756f796968","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007ef04686173680200000000086d657461646174610c00000004046e616d6502000000086f7069756f796968096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0xdd6502fc8fcd20c3c91480fcd640826b1085e2ba5d2b2658bca425623ff3e165"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcf93ee58a4d3a14e7bd32d24a46a4fc850ddb7597606bb6581e4151b908db816","index":88548},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000003244d912409f5845722fb4a90a85e20bb0533d014fe2f87ae0e56f46","index":2410498},"confirm_microblock_identifier":{"hash":"0x61a95c4844cc1ce8f49fb9f17ab12dc63bbd59fdbefcba573520ceef6d01a114","index":2},"pox_cycle_index":390,"pox_cycle_length":1050,"pox_cycle_position":997,"stacks_block_hash":"0x21a9e5a0c8ae4b65a7fc06b184a8eb0093eb5a147c8c40903c60201b3f5593ac"},"parent_block_identifier":{"hash":"0x6e966f4f4df5935692fc14c599ce8f8ecef82df689ac98c30f51666ade4ceb86","index":88547},"timestamp":1670582548,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646166727476)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x646166727476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d4000000000000000f0000000000000bb80001fbc23b21b9a5036dd32c606494a90a094d9b9a7ead1ea6e8867bb0c63b343c284d32a373073a6f4d48b966eee59a41612e8ab887b8f7c600d55ab7654c36cff4010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646166727476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007f404686173680200000000086d657461646174610c00000004046e616d650200000006646166727476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0x1af9e43922b5161f28b7818c6833774c47fcdf3c4e51ce70424acd87f938cf8a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x82ba20aaa96d6a1d377de58f73a9e3be9146ae9d96870588675455e95a780dfa","index":88921},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000316ebd6c83f1634a6152258bb38cd5754604f64f7bcdba2623","index":2410914},"confirm_microblock_identifier":{"hash":"0x7ec2c35a65d3b9a36ff467882f935b57ba9b4ca43b2a9a3b46eeb6791247aaf0","index":2},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":363,"stacks_block_hash":"0x2219c9d089b784663f5e68245fa28350827f6ea6a429c032f4bc45840db0a4e4"},"parent_block_identifier":{"hash":"0x0de811cf7b4a35559fe6b02975531c3dfe5cf2b226869313e8484e796b6a5a54","index":88920},"timestamp":1670833217,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6b6f75796776)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":15000,"kind":{"data":{"args":["0x627463","0x6d6b6f75796776"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004000655085431e875f55cfa5b60581b22d9a623805800000000000000080000000000003a980000950f85af54680fc3b1a0c9cae1993878b85ec8e7a6571899af2e10258fb860cb775531c888c7f02e56c0df6f8fc7a07c9b83828a1dbfc56356260ae838a559bd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076d6b6f75796776","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000007fa04686173680200000000086d657461646174610c00000004046e616d6502000000076d6b6f75796776096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a0655085431e875f55cfa5b60581b22d9a6238058","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST35A22M67M7BXAWZ9DP0P0V4BCTC8W0B15WRXMP","success":true},"operations":[],"transaction_identifier":{"hash":"0x6852b579119fa32ed0db0b9e06b969ed9c8ab959bbee3dd47f7229ed2e4c368d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb92737f93e49452ca6080fd5d355280f0fe6fdd220be8eda6c8253a8727ee1c2","index":89062},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000095d5d2e558ea381f43f82f3419a659f818f58fbecc34fec0d","index":2411067},"confirm_microblock_identifier":{"hash":"0x7924e72bfc153d14e3d8bf37f0fd2fcb9e875f8f594b315cdc7c52a1d59c5d7f","index":4},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":516,"stacks_block_hash":"0xb4fdf28f6db611d46e9d8cdcc2479c7c5c03b9e34b3c190d756712edf5ee179a"},"parent_block_identifier":{"hash":"0x01ec1ef632e57a7367e596233090a47f2cfd93b1fdd28ed100993f0ac47c0685","index":89061},"timestamp":1670924164,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x697268746276)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x697268746276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d400000000000000170000000000000bb800012ce88d86d6c5f27d81a5b7743bc6932be202f66fb21f82fedc5d0e2ea207524b77fe73bc34723cdaa46abcec4a404abadc84186e82adc6948d2dd698f1a65b16030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006697268746276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000080104686173680200000000086d657461646174610c00000004046e616d650200000006697268746276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0xacdbd3c35c918b5d6edcf73cae61fec5f2565dc67ad23d1d4e032ae4bfe1a997"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd6c58fa18a63400704e9ae2055df1eab4db7dcd7943f571236b1f91054cbcd94","index":89092},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000001224d09ec45a75e9d878a15ec7ce7c0c747e4737def989116e31","index":2411100},"confirm_microblock_identifier":{"hash":"0xe8c87f15f760eeaae7720f87e1d57b079f982fee8001b0ee0c4bf91b0904f0c4","index":1},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":549,"stacks_block_hash":"0x077d7465f9a67e488b03aa4a72e5b9414dcfec2e77b869141dbc6dad0a43be00"},"parent_block_identifier":{"hash":"0xb7c949c13015e98810253c7cea5eb944bf7fa5fd6f8856b4f70c422b443e6ac2","index":89091},"timestamp":1670947284,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e657762696c616c646f6d61696e)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":30000,"kind":{"data":{"args":["0x627463","0x6e657762696c616c646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007a4389649f07fd1bc0383216339055b5922005cb0000000000000007000000000000753000008fd6b8e5728ee2f36219ed37d35a3e061a45f9bd6a2a29a87b01f8b15dab7b7375a41bd246693fd6683cd0cfd7a4edfd4eae1f2b850f037e52cb0e408502cd25030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6e657762696c616c646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000080604686173680200000000086d657461646174610c00000004046e616d65020000000e6e657762696c616c646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7a4389649f07fd1bc0383216339055b5922005cb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1X472B4KW3ZT6Y070S1CCWGAPTS4805SCT6P4WG","success":true},"operations":[],"transaction_identifier":{"hash":"0xe2c5717743de13c6d6ce683518dffd0d16394391df4abbcab479c42e0d78b521"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x51544c355163f3e944eac4e5083d1be85bc36b1b44d3a138f5797457e1100080","index":89200},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000263abf535dab759b4453737c3eaec58e2cec67f36a0b82c2c0","index":2411221},"confirm_microblock_identifier":{"hash":"0x2c062c130c86a7ef6239301b7ce894e04e5a29d0c928dbb48bc83750093331ca","index":1},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":670,"stacks_block_hash":"0xf17b6901f506efbb4ae835eb22203f86e3d57d0b159a112779a7f02f4af8078e"},"parent_block_identifier":{"hash":"0x50cd85fbef94bacb3de37a072f7f713a3af96c482e23ae3424d18c39c9113d7a","index":89199},"timestamp":1671010694,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c616c61)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x62696c616c61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004007075c88ba7e72f517b90acd5d6bbc7835e17019d000000000000000e0000000000000bb8000189360a353c7e447a5fb3beb2e1e219c28947a4b3ffc3a807414e2a3930d79fd95ce157d0895138e397948692f7cc9f958365c69162014c02562adbeb92af45d0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000662696c616c61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000080804686173680200000000086d657461646174610c00000004046e616d65020000000662696c616c61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7075c88ba7e72f517b90acd5d6bbc7835e17019d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1R7BJ4BMZKJYMBVJ2PDBNNVRY1NW5R1KPABFN83","success":true},"operations":[],"transaction_identifier":{"hash":"0xcd8e724084f18a943d0b3b8d81c883914964e0b469cb8929434f06e8205df88f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1c006b3d1a7d86d85b5ed624ef96b29f5fd80fc10af790279629ffd258ba22f8","index":89202},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000005ad47d00a34fa7991fddfbc92ebd0189b04509262ea0a474d","index":2411223},"confirm_microblock_identifier":{"hash":"0x7346c15f38f118b83b88c6457881374baeb97615a205e0521555cd6b4068d0ef","index":4},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":672,"stacks_block_hash":"0xc8736351b3dc91cb5e79b23bb3997cf6e167a78ce2563f5023d078fc4b36d90f"},"parent_block_identifier":{"hash":"0xf892f3e5112b53593fe9b01876914602b8c4f02d8213cae97c7ae38744d256a1","index":89201},"timestamp":1671011339,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b706e6a626876676a76)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b706e6a626876676a76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ff9d506e524ff4cae45a36639d29de9240829f1d00000000000000060000000000000bb8000022c764a01649fd1abfef7b1d2398bfab84cbc4f5348999c82c7c3e32002d2b1d5edc737ce36c9d05aa60db9d725f72582207c3ac233db7a596ef342a67a4a0dc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a6b706e6a626876676a76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000080b04686173680200000000086d657461646174610c00000004046e616d65020000000a6b706e6a626876676a76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aff9d506e524ff4cae45a36639d29de9240829f1d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3ZSTM3EA97Z9JQ4B8V67799VT9410MZ3Q397GM2","success":true},"operations":[],"transaction_identifier":{"hash":"0x62705b572db33037422b9519ac1c40ad41ccf86f7c27ffddbb7c455d316d0784"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x69ae56efe8e09d2df4242d89c16ead997fc553731b04060ce92068881170fbb2","index":89313},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000002e9d779f404ae2a72537c627ab53188273e39d2ee889835c45ec","index":2411339},"confirm_microblock_identifier":{"hash":"0x9558e47609b5e6c8d642c4fdea3e4f82d0ec3bcf4e95fc3ce6a32c0d24848d77","index":2},"pox_cycle_index":391,"pox_cycle_length":1050,"pox_cycle_position":788,"stacks_block_hash":"0xf9a541abe4d6b52cfcd1a88498b1a886ed9b4f1296ce146a6ffb04daccff32bf"},"parent_block_identifier":{"hash":"0xd9a178d2b188ec0937ff4b10eb69f56127028e27b195adf7eb884fe1f0a7282a","index":89312},"timestamp":1671090438,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6272756365)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6272756365"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":24,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400cf170cceaa11f1a9ea0766260a4bbf36385631a600000000000000180000000000000bb800015cdf3e103607b4bdb70915072755eab0b244186c9f6f45c9e0c7e5afe1a08214368016bfb07c8688a0fa5e9c0d138c8ff8fe77d841d94560952feda3eb8cee30030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056272756365","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000081704686173680200000000086d657461646174610c00000004046e616d6502000000056272756365096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051acf170cceaa11f1a9ea0766260a4bbf36385631a6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST37HE36EN88Z3AFA0XK2C2JBQWV3GNHHMRKD5W46","success":true},"operations":[],"transaction_identifier":{"hash":"0xedb62ed75e727ff37a7671dce2575258b5a1a52775d43cb99009963c7c00c447"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6272756365)","execution_cost":{"read_count":12,"read_length":43966,"runtime":131782,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6272756365"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":25,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400cf170cceaa11f1a9ea0766260a4bbf36385631a600000000000000190000000000000bb8000057698cd76d2b16ea6a69c4f0d0b8e99e0bcda4eb233e9d2a04cb22c294e9a5e300ea0c88eadc1c8c6027be4ba00f3161546bfabe97c143537b739736ebda907c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056272756365","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST37HE36EN88Z3AFA0XK2C2JBQWV3GNHHMRKD5W46","success":false},"operations":[],"transaction_identifier":{"hash":"0x44d29125c140ee8077a7832ba1e10f9d009bfe84483efb7aee7ca60ed8146c4b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2dae2c287e25d7da00cc48b694a7d169caa1a080f89cc4615a4e1e6f90439d8e","index":89840},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024b166f1741bf0d3c5b0f6ae9e5a540f308f0feca345279370","index":2411899},"confirm_microblock_identifier":{"hash":"0xd73736a3666a200e912df97918754773df6eb1f866d0c3df29a0b32447baf360","index":6},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":298,"stacks_block_hash":"0xcbeb1105623561eba3fded4a758d292a62be1e1acc6e1cac47f3bb7d8b895cf2"},"parent_block_identifier":{"hash":"0x7bbe63f9b87e24e768fddec7d2470f25f7d01386cd0bf5064c376401a40e753d","index":89839},"timestamp":1671464823,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a666b6c64736a666b6c646173646a666b6c64)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167581,"write_count":2,"write_length":170},"fee":3500,"kind":{"data":{"args":["0x627463","0x6a666b6c64736a666b6c646173646a666b6c64"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":33},"proof":null,"raw_tx":"0x808000000004003f67a76b82c8d4fd09755f64589142b2f0ad7f6900000000000000020000000000000dac0001f677f3800dd5b0b36b2a59370068502ddf000f3511d1ddaa377cabd8ec48457216fa7068c6ad030bdcf050cc337382450afe492e68b90fc1e40db1b3a78804c3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000136a666b6c64736a666b6c646173646a666b6c64","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000082904686173680200000000086d657461646174610c00000004046e616d6502000000136a666b6c64736a666b6c646173646a666b6c64096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3f67a76b82c8d4fd09755f64589142b2f0ad7f69","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STZPF9VBGB4D9Z89ENFP8P4H8ASF1BBZD67DASG2","success":true},"operations":[],"transaction_identifier":{"hash":"0x3b4e8b0fb8c59943e54492a9dade92aa199c94f1125983e85824e0279c987834"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf1b40a494010645883d6b9913636c52bcb21ccdcd56a049004e09d26533477ce","index":89935},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002fcf21067a0532a4b635fd62ae432bddcd768e055ea7c165d5","index":2412001},"confirm_microblock_identifier":{"hash":"0xdde8359556a9237a68e2b963951129ea1d55eeeaad172d6934dfb1992fe9a252","index":4},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":400,"stacks_block_hash":"0x756fea7891439a64df659715c24e56e52f43fb6ec7fab61c7278a45ce1a1ce93"},"parent_block_identifier":{"hash":"0x30af72c54ed40dedc126a216c542ebf1752ea9cfcd39f8e20c8cc959920009f3","index":89934},"timestamp":1671537505,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64657369676e7465737431)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x64657369676e7465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400e7aa7e585937d78dc3ffc492f73857c54c676f6300000000000000020000000000000dac00010984c8c7433a02e8a955fac601423839377472be88483ef3df86a3c2dac08c2200a995326170dd3dd0c23c8105017c7c355924a24edb5c8ecdaf4f5a1b8ea88c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b64657369676e7465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000083504686173680200000000086d657461646174610c00000004046e616d65020000000b64657369676e7465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7aa7e585937d78dc3ffc492f73857c54c676f63","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KTMZJRB4VXF3E3ZZ295XSRAZ2MRSVFCC3DNC80","success":true},"operations":[],"transaction_identifier":{"hash":"0x4e13c54b8180f5887edf481cd455d189c3ef2bc132ab5e09ccb7e488d9bceb3a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x31114b465f8453c3408b05211e010f551385df659a77631cd18f95310065af10","index":89943},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000c234e1d48db7fd7f3df6e9b56a8704a89bda958ca937557c77a4e5dc","index":2412009},"confirm_microblock_identifier":{"hash":"0xdbb507f2df8fc3cd38f61412523b9d8d46886a11a87a6a53487d03533c0d407b","index":5},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":408,"stacks_block_hash":"0x8748c1e7b844eebd270f8ee639f8d66264c21a21ef47eef57617a1be2c728f9f"},"parent_block_identifier":{"hash":"0xaeb7b063b7a8a593fe59d53085173138d9099a3135a4693522f9226157244f3e","index":89942},"timestamp":1671543461,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646e616d656661736466)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x646e616d656661736466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":37,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d400000000000000250000000000000bb800019fa36125bcfeeac25ee52ec6a78e0fb334d3879ad89f98a2ca05fbf4e10e480e75b9d90f03372681b3f4d996c89a1ffd631b1c540c67bf8d8e8732b6672c3d98030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a646e616d656661736466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000083904686173680200000000086d657461646174610c00000004046e616d65020000000a646e616d656661736466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0x440a4415b59a78eca3c749751a1e97fe013877923dfcad2f5383dcbecae5a5a9"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364666b6c6e73616e64666c6b73616e6466)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167542,"write_count":2,"write_length":169},"fee":3000,"kind":{"data":{"args":["0x627463","0x7364666b6c6e73616e64666c6b73616e6466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e000000000000000f0000000000000bb800008eed006519a10d24cb55407be07d7875ff9a756c3f3701b58d115c2ec20ddb3e36632f02de031a327cafe7c200aa733a464ef943f97a35ed3a7d4cced6fb1837030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000127364666b6c6e73616e64666c6b73616e6466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000083a04686173680200000000086d657461646174610c00000004046e616d6502000000127364666b6c6e73616e64666c6b73616e6466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0xe5900fbe36a05d06a976b2408cf06098d037f435d47f0a08b3f98d6329bfd8a8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf56fb0d9a9e4621dc5c4ab34f459a04f646cb2d0f0cdbd748054a4cf526d5223","index":89945},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000441c5cc5595a63f4a5f4e2f13d410ea39142ef604ac03325b2c0e00b","index":2412012},"confirm_microblock_identifier":{"hash":"0xfaaaf652547b962111fe6582a91d5da9cd1ff29cdd685ef3081ee894d816dbe5","index":5},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":411,"stacks_block_hash":"0x918d6d547665f6f63e545d5d88362dfaf8484448493f37d31609ff0e5a9f2bfd"},"parent_block_identifier":{"hash":"0xfa7694357069fdf5504b97e88b7ed3a9be54738227663c9ca7737330ce710d23","index":89944},"timestamp":1671544899,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x74657374646f6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":6},"proof":null,"raw_tx":"0x808000000004008435c694e51024d978ea3fb42971d74b8ff3df35000000000000000e0000000000000bb800000ac2d03f3fb8aea416393dfca767a2f054682e328518833424ba651df4a2388c00ecdbb03b9a5e63349e735d73e69666a0e4e93898bd3a99282c3faddb00cd4d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000774657374646f6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000083d04686173680200000000086d657461646174610c00000004046e616d65020000000774657374646f6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8435c694e51024d978ea3fb42971d74b8ff3df35","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST223BHMMWM829PBRX8ZV8ABHTX5RZWYZ6PTJCWC5","success":true},"operations":[],"transaction_identifier":{"hash":"0xcec99c4bac13d1e4840cf90dafc9da35b1a664d2f1ef6da9e1b334884d7a9569"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64657369676e7465737432)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x64657369676e7465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":49,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a800000000000000310000000000000bb80000a7c5cfb2ec7d679212559799def266f6ac64645d9daeb53368e2e56d0a76908a1556c4294e42abdbdc3b3d34548bff289f1fc367a5b9b810a169f938fc6c4e92030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b64657369676e7465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000083e04686173680200000000086d657461646174610c00000004046e616d65020000000b64657369676e7465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0xbcfcef3c1fbd0022835670335edcc7f62a8e4ebe392d2d43a41594cc2d8f7943"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x60dba64f131d05ec1426eb4b6add3d90bbade3eaf7c3e3b982a9aecd81c40b44","index":90052},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000b9613d9bdeac35888adeb0049671a6a25f8aa6c9c6ee3e1df688b289","index":2412129},"confirm_microblock_identifier":{"hash":"0x61e74cb3ba44fef9b204ca8cda40939daca92e3601ca91e18984e29482c96242","index":3},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":528,"stacks_block_hash":"0xc502787723885851bf0fa820536d0eeaef8e549371ae7dfe3cb2d3f0dddfa615"},"parent_block_identifier":{"hash":"0x853507e670e7426ddf3f1b5aeea1c36cf3368088dd5a76d04a0f57c0ee9b7948","index":90051},"timestamp":1671617833,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6c6a63667667626e)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3500,"kind":{"data":{"args":["0x627463","0x6b6c6a63667667626e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004008435c694e51024d978ea3fb42971d74b8ff3df35000000000000000f0000000000000dac000087a4b5adc2116d22dad9203c86cef328857aa713bf630459b5f99a63959783f1757af8a26e084e3110dde640ac7cca33e63b4e16d6e4f9182ba1f8f61967e320030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096b6c6a63667667626e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000084504686173680200000000086d657461646174610c00000004046e616d6502000000096b6c6a63667667626e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8435c694e51024d978ea3fb42971d74b8ff3df35","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST223BHMMWM829PBRX8ZV8ABHTX5RZWYZ6PTJCWC5","success":true},"operations":[],"transaction_identifier":{"hash":"0x23b2582803838e686b7016851e334efec4fce81c3100c1508e25e83f3ca4117e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfe299ccda5c36469b545feee3947e6ba8455fa7e6a1c56c27217c3ae2bbf4f25","index":90206},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002bef68578e492616069f55021d8deb3ce445c56d4c53a56af2","index":2412304},"confirm_microblock_identifier":{"hash":"0xf11b508dd705930b367b4fa59442b153bbff7390150bbf3486db4a93cd95c939","index":3},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":703,"stacks_block_hash":"0x942aa7a8423c0a64e95e9340f78581cd32080252a06b9e7ed70757fde847b2aa"},"parent_block_identifier":{"hash":"0xac366e6958ba6909bad94600a60bfbc859878c3181ab83c7afccb0732e8d3402","index":90205},"timestamp":1671703137,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d33)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x74657374646f6d33"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040024da0a91ab07e014ad63796cdba16372bfec1e8e00000000000000100000000000000bb8000116ef1a6df107ceb65c948f8b8782220ee388671a4924b53ed8db33c396db6071213da9cc565c452656378a59be1d0590d7ac494fec8a6385bd1ca5d787b1668a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000874657374646f6d33","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000085104686173680200000000086d657461646174610c00000004046e616d65020000000874657374646f6d33096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a24da0a91ab07e014ad63796cdba16372bfec1e8e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJDM2MHNC3Y055DCDWPSPX1CDSBZV0YHVH4YHVW","success":true},"operations":[],"transaction_identifier":{"hash":"0x6ef63b0e95f6728db6e5b5b33d2fe4eb85e8166648179fb5bf091a37a2dd9621"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd3becb4cef3b56adb6d6ce5b1e6db8405d72ff07a4cf3601426966550ec39e3f","index":90209},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000060030d9b1a9cd4525937020b991d2bc43858cb198ffa236728233","index":2412307},"confirm_microblock_identifier":{"hash":"0x8678809e9653c6ba16c3371da675a28108494e06599872da7e76f37237ea2fa5","index":5},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":706,"stacks_block_hash":"0x605b438d1f96d94a861a96c84b988931b98339ef1110461ba9edb62da9c5e470"},"parent_block_identifier":{"hash":"0x54d3e422a2eaf7c2b63cc22cc4ec490ce8c65a5228f139c7a8e22b2177e36b21","index":90208},"timestamp":1671704937,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736466736466)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3500,"kind":{"data":{"args":["0x627463","0x736466736466"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004007075c88ba7e72f517b90acd5d6bbc7835e17019d00000000000000170000000000000dac0001ab8ba55a1e5f3692a32948278d1e6173dd8b58c3722c706798b8153898d476622bf146029a150f6fcbe11123f7a0a9c6ebb8bcc2d88a4de5b3995e9a0a7f02c2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006736466736466","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000085304686173680200000000086d657461646174610c00000004046e616d650200000006736466736466096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7075c88ba7e72f517b90acd5d6bbc7835e17019d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1R7BJ4BMZKJYMBVJ2PDBNNVRY1NW5R1KPABFN83","success":true},"operations":[],"transaction_identifier":{"hash":"0xa65b75ebe5572f423c7dbb1d3c58f3300332b3b5971be7441951ba3ca779480f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9ba589052e58ba1e9a9268ae7db2a7eb3dc3709a88cd96e09d3649cae68618b2","index":90337},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000775aa6c4ccce72025c237314bfdb7c43d608b7fad1d9d66f9f6f","index":2412442},"confirm_microblock_identifier":{"hash":"0xff96c0028fb9f403f96fa64b0c848ba93f53e866f43dc30f8ec18060062dd06b","index":3},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":841,"stacks_block_hash":"0xd124554c5e9aaa67c315ff01b3e33e6b8e4c87aeaa69a732ed13e535b79ea167"},"parent_block_identifier":{"hash":"0xc9c9c2ee8c46f2ec203d03df28a4d59637d329f4e56b174a1899d5a7136be1f1","index":90336},"timestamp":1671784247,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d32)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3500,"kind":{"data":{"args":["0x627463","0x74657374646f6d32"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000010000000000000dac0001abc7e1080063b47c08fe19c06eee8214036dbef8662776263ff702570ad850187e1b338c16411dfa231d6e375aff300bfb77e8874cb6a8c04f821621eb394a9f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000874657374646f6d32","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000085c04686173680200000000086d657461646174610c00000004046e616d65020000000874657374646f6d32096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x6838e23859587159045ae841bab253901dc384655fee78f38f985219e31ce631"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x71bc78903ce1a55d61adf99de68c3b376e03826f509932d418af67bb48d0c803","index":90359},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000249c20360a29741a97d09a2800488bc050c4f01bb4efe11c8e","index":2412467},"confirm_microblock_identifier":{"hash":"0x4b341eaf78e8850492a76eba79bb63bd778bfd95e21f6f499bfc8ae68c3999fc","index":5},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":866,"stacks_block_hash":"0x5817ce6a23f0acc8f89a545116e027d8fda157e503894a529f9bf2fb58b9a0c7"},"parent_block_identifier":{"hash":"0xc0025dc32bcecf0334747f9cfda5e18c6da2e80c63ba11d09ea49612ed5c9382","index":90358},"timestamp":1671796311,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646673647678637662)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x73646673647678637662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a13d9a0b46eaf8ba12c036b9ed46e6783a72107a00000000000000010000000000000bb80001829b1e2bd5614685e74d2f839ed030bf21c49c714371b39dbfd5831547d40b441275857f6f51c3f7ce0b914adad423ff04b46854228d4f0ef6854932946d1f49030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a73646673647678637662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000086104686173680200000000086d657461646174610c00000004046e616d65020000000a73646673647678637662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa13d9a0b46eaf8ba12c036b9ed46e6783a72107a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2GKV6GB8VNFHEGJR0VBKVA6WSW3MWGGFBGQGZES","success":true},"operations":[],"transaction_identifier":{"hash":"0x105eda31a487d6eda72234de5b408960a3bef0b5d64d40eb6b6f8b53b2785ebb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf2a1fd50411fbf9ced43314106d7f93ffacb093ddf6b5b4d180874fde8454f8f","index":90501},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000058812e9525debcf7a2caa9f66514c0b8ed38a10a1695b284d","index":2412627},"confirm_microblock_identifier":{"hash":"0x26f5a64baa5d011c794e80e7724c9094f7d4f422be310b721a071af545834118","index":2},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":1026,"stacks_block_hash":"0xceddf517af88ed3d02ed89cbd4fcdc7772b2c256b91918ca6cff9795453ac9a8"},"parent_block_identifier":{"hash":"0x2fbcc35f1af6c648a4829df9b063895dd0bbe1b6c9d0ad715ca338b60b5f4e9d","index":90500},"timestamp":1671873468,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61706974657374646f6d)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3500,"kind":{"data":{"args":["0x627463","0x61706974657374646f6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a13d9a0b46eaf8ba12c036b9ed46e6783a72107a00000000000000030000000000000dac0000972a65bc2993cf2b6605dce1b52bfad4184b53d8854742d6f5a1a862026ba56715e93a9a155c1cda3be6e469b8866166ec76a80d1c9fbaa3f6bae351aca32fd2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a61706974657374646f6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000086604686173680200000000086d657461646174610c00000004046e616d65020000000a61706974657374646f6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa13d9a0b46eaf8ba12c036b9ed46e6783a72107a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2GKV6GB8VNFHEGJR0VBKVA6WSW3MWGGFBGQGZES","success":true},"operations":[],"transaction_identifier":{"hash":"0xf5b2da4126823b384cd38e778c934d52b342f4288844f936ac5dc228f23a3c77"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3fd5f88c6d43b0f79e30722a21c95af498b4b37895c8261804a3fda2081c106f","index":90507},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000022366f5877375c35a4391d65b6aa490b40816aa0a3ebf19de9","index":2412635},"confirm_microblock_identifier":{"hash":"0x3ee447dd61816da0fd6a4e329c26db4b738b1378948cd244cfd3cead18dc9989","index":0},"pox_cycle_index":392,"pox_cycle_length":1050,"pox_cycle_position":1034,"stacks_block_hash":"0x8fef72e8e940c26a3054115bc326c01792479ae51461f187ba440ba714be8a54"},"parent_block_identifier":{"hash":"0x090c530e1de30b6d63163a590d03ec8e6914dd11b86737fd372de01a68c06bd8","index":90506},"timestamp":1671877469,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7465737461706933)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x7465737461706933"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040057aedcf36e05d9414a98a20ba7a105821a3828d8000000000000000c0000000000000bb8000025714cfd08c6447f546c2bff05760c20153ca86e4f9af8dc9f007b9ca4ecc5a859e13047c163a8e5030aa3b26dcdbdd28ced6fffdd8099efa10c916236145136030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087465737461706933","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000086b04686173680200000000086d657461646174610c00000004046e616d6502000000087465737461706933096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a57aedcf36e05d9414a98a20ba7a105821a3828d8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1BTXQ7KDR2XJGAAK2H0Q9X10P11ME18V03S3KR2","success":true},"operations":[],"transaction_identifier":{"hash":"0xce99f1e2b6e6482c25c6a42fcd86d282169be3e8563acb501c244f2ed1063a35"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe43b23a7948c2737debe2f917226c0c0af0395df663bce68db4479a1a171cab1","index":90798},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002bdd8dca374fc1f630866c87d7d7770be80b2a8f0bb5d3c44f","index":2412954},"confirm_microblock_identifier":{"hash":"0xa6a07b6c011890d4deadcca36661fbfaceab42424f46055a52f8604a5fdf8ec0","index":4},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":303,"stacks_block_hash":"0xb9e2494aada1120a6f494a5c43cc28f4285f87d42df97f61df89e8291e02add4"},"parent_block_identifier":{"hash":"0xddb46b327867cf6c04c1b0b5ed669dddca1a6ae7f650633819ee5355efa1fce9","index":90797},"timestamp":1672042858,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6170697465737435)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6170697465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400a13d9a0b46eaf8ba12c036b9ed46e6783a72107a00000000000000040000000000000bb8000056bcdbe851fa9af77d7d82255a7759c33798084785a159b9a57e0f5fcf572e5b0026af654b6eed6c673fe744162f1dea5dc29be3d31d3dc3082904e2e5f53ec4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086170697465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000086e04686173680200000000086d657461646174610c00000004046e616d6502000000086170697465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa13d9a0b46eaf8ba12c036b9ed46e6783a72107a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2GKV6GB8VNFHEGJR0VBKVA6WSW3MWGGFBGQGZES","success":true},"operations":[],"transaction_identifier":{"hash":"0x35dbd08fb659ab13555e594521876a8783d4817bd93bebc5febe3b9bfc948b67"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe3666756c4195375fc8bedd0c85c6c5daea033bb97c93e8cddf2522657bcedfb","index":91062},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000fc13a22bddf6c7046a02ddcfab1d6fab11800ef661baf1b48","index":2413236},"confirm_microblock_identifier":{"hash":"0x89b79e05654577ac38d31c1e834bc8926fa8954c58436467a8f06e88b5680b96","index":4},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":585,"stacks_block_hash":"0x8f206af51700f1462d312d61436499070f0a980a4f1a36a2b3ebf7c3fdb455ee"},"parent_block_identifier":{"hash":"0x82e30d6044512466e6e10ea47f2edc3c99ef1f88ed9ae2933ce0593b63fbc0cb","index":91061},"timestamp":1672222060,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e65776e696e69)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e65776e696e69"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400218f918e1d7363c0e4cdf3f8cef078ba823cdb1000000000000000000000000000000bb800003a2a07a90712ee244babc2aa89ca9e75a760bbff16377f9566a6a08a0489ad7b36a94e77fa6f966a225d5af4782eaa21082d7cd787a8e47b6a54031083d46041030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076e65776e696e69","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000087f04686173680200000000086d657461646174610c00000004046e616d6502000000076e65776e696e69096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a218f918e1d7363c0e4cdf3f8cef078ba823cdb10","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STGRZ4CE3NSP7G74SQSZHKQGF2X84F6V20JTCVB4","success":true},"operations":[],"transaction_identifier":{"hash":"0xda683ae4753ccca79a4b7d9566d892c7bee5889dddab3c8dc43be84ad9e3d5bc"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcbe2092cb8e8b2178f4eec6f6c7b68ce11aee1f99978d6461622d48f3dfde19c","index":91075},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000d1d57c991f1d885eaf7219e34586869070bf6653699ace513c53","index":2413249},"confirm_microblock_identifier":{"hash":"0xc4d010a605a42b6b53e80171e328ace0873e12c3ecbf53096c5b5ba272134974","index":1},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":598,"stacks_block_hash":"0xda4d7bb8be414a0ab248acd9aeb3a46c6bd12d8a7449846d83d274240690c4f4"},"parent_block_identifier":{"hash":"0x0463c024afacb46d665d80b418fac9674c9dc5df1518b2d1709aaa410c971130","index":91074},"timestamp":1672230321,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d3738)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3500,"kind":{"data":{"args":["0x627463","0x74657374646f6d3738"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040057aedcf36e05d9414a98a20ba7a105821a3828d800000000000000170000000000000dac0000fa0b7afb2ffbc242d2c9f66c705c71fa7e097189d78d432954a69d9bf52724860c1224285754df05f2d812c71c94c4b498461fc1d9bfc557fcf1e8509e15bec6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000974657374646f6d3738","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000088104686173680200000000086d657461646174610c00000004046e616d65020000000974657374646f6d3738096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a57aedcf36e05d9414a98a20ba7a105821a3828d8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1BTXQ7KDR2XJGAAK2H0Q9X10P11ME18V03S3KR2","success":true},"operations":[],"transaction_identifier":{"hash":"0xa93a327e8ba6306ea53be848998c55fb3e24c6ec5cd798e222be9d75bf9ae93e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0e5d4741f44f00b0ff85707bb61b60f501486f68c192bc0a47b90207c1ae6e5e","index":91186},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000009020a5c4fc8468fabee13b71c5f0298300aac1432b948d31a40d","index":2413362},"confirm_microblock_identifier":{"hash":"0xe92fda0e90e3bcc1055000c5486e1f8a328b6c0c59d23d746a9fdbeaa135f904","index":2},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":711,"stacks_block_hash":"0x9e1178060ad09b95307df9fd6af996e4b94243cd112488ca2e2d7a2081e49596"},"parent_block_identifier":{"hash":"0xe22c15f59b5335758060d20fb00a3eb8030acb230c7e762741bc489b2ebc2eb6","index":91185},"timestamp":1672309327,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x70696e6b6279746573)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x70696e6b6279746573"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000000b0000000000000bb80001956da68a60a6624d5677f474fea0165b627b46fc6c0d02376fd1758e5529e69d6ebaf5af4d025492ee5e1a16bdefca8b3ccaa5aca6ef3937800113695b00a9cd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000970696e6b6279746573","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000088804686173680200000000086d657461646174610c00000004046e616d65020000000970696e6b6279746573096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x7f27df7a15d4cb7ac53364babe93c50aac6723679194f5262a612590e0432f1b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x79eff7cac6b31b581c81d7af09a5905e6a8159248e58d346c5674866c9f53645","index":91193},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000015e875bb1ac4da9ddac8152eae46bbeb9625c32e69bf21559f","index":2413371},"confirm_microblock_identifier":{"hash":"0x3cc73efdd5e7937afa0b5bdfddbaa6c7e10ab58bd9e16411227c09d67700c677","index":1},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":720,"stacks_block_hash":"0xd484a617089d7a253ba5869f62f2d8f61498779f6569e413948292baf57db3b0"},"parent_block_identifier":{"hash":"0xa090fa83a2357830434f7394988a22603289efd8f71141b2fb93cb6b143745b6","index":91192},"timestamp":1672313715,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265646279746573)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265646279746573"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000000f0000000000000bb80001a2785df1d0a5f29b3fb8b32f3cbe0e5c3e5bc68fda31d2349a71fe05670eaf1d0c6a4d9129184f0695d3b3dbf33044d3d7553ecb373e613c3cbd7fe3ab2b860d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087265646279746573","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000088b04686173680200000000086d657461646174610c00000004046e616d6502000000087265646279746573096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x0f50d4e73450471c3c97c8c47f25e4dd27c807d5f4705834290e71fa9a6ab0cc"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xee47cf3c75db256bf31f4a8c43b461bb29804399baa1dc6e891b56d018629c85","index":91196},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000000a5286fe2fed4f5fc67ccf4945da19fe563d5c0fd014b6d4f","index":2413374},"confirm_microblock_identifier":{"hash":"0xbe4d016ef7d86619eb86d9b874099926ef09054ca34496649f3709d0707bbbbf","index":0},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":723,"stacks_block_hash":"0xc9f5b064402925e07590bfa44bf39fc9fa1c45d70593497ffaa0d38a5e47f400"},"parent_block_identifier":{"hash":"0xe15848360669eca1e1063ee29af4ea00cb2c450ca44452e51a3349ce4041c3cf","index":91195},"timestamp":1672316262,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x75797674636678636776)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x75797674636678636776"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000130000000000000bb80001a664205e85f11d1802f421d61260511c84e5f0ac97612cf242466bb0aca5966c51880694e64f60b261d8f43b3fbd9a544c64cfff02fa35e899075db0132aaa1f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a75797674636678636776","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000088e04686173680200000000086d657461646174610c00000004046e616d65020000000a75797674636678636776096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0xec00bb19b0610b5ad670cf1496d86d05f8e0b38c9039041fbd4f916efa35eab7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1e4b378e8aa0fd53f2383412fc53e43e0690e44d07ef67a7f5295d314e7d9999","index":91201},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002eb9040540c76e39bbd875540400be50f8c52e58056eb61423","index":2413379},"confirm_microblock_identifier":{"hash":"0xd32f30775ca83eeb72b6a4a60b78c3757df684418534e413ce4eaf2f8830478b","index":1},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":728,"stacks_block_hash":"0xbf571f0b3b052805c98804207000da4b15462276c8ad92eb64f9983552effed9"},"parent_block_identifier":{"hash":"0xf72fcd573b749732d5312fd7052d73da1e1f89ce7481e587873dab54192aedf8","index":91200},"timestamp":1672319325,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6268766763667864)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a6268766763667864"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000170000000000000bb8000197661d0f39eebebb9801d3935f0b7f0595b28027caf03914ffa87819f2a510b17c4eefc4cc100346291db56886daf9642d2c4161ee681628d15c66c726d2198e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096a6268766763667864","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089104686173680200000000086d657461646174610c00000004046e616d6502000000096a6268766763667864096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x0cad3b8dfa51215508a5543337e76f9428a7a81121f3aed60103a7427bcc8717"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3433ec206caff6e7631b70fd11ad857bced6ae22febbea2bf5b104cf7fe335fe","index":91207},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000bc633545806d8a11e51e5b7703ac624c3c16e9d5ddc95d03b","index":2413385},"confirm_microblock_identifier":{"hash":"0x133a519f582d1bb07ae23bdce7b05953e7e15f9fdbf3dddc88b7ac95aea345f6","index":0},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":734,"stacks_block_hash":"0xc746eff9f1299881a9b11a1158857fbc359b354463d40f3540074898f49dcf08"},"parent_block_identifier":{"hash":"0x4fb7b47af270632a110b4b479c34750cfb681a82b2e2e19c63f3fc63818d9532","index":91206},"timestamp":1672323426,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x67686a686e67626676)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x67686a686e67626676"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":27,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000001b0000000000000bb80000520fef8a6c1242ff1444172e3794eb2821f7dfc373d599261a35749be9dce0d72176a5c53f1f28a35529bab7ed0297e3f6046fe15b921fc9300a986a9fb5bc15030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000967686a686e67626676","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089404686173680200000000086d657461646174610c00000004046e616d65020000000967686a686e67626676096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x37b576d00d4d1d40d5b415aa1e74ac2ce3dd0af2adb3a328331516c6f5cc10c4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6fc332172cb96e730e304147d20b8d46dd7e84c4a68402a20d8086bf0ee5cf1e","index":91214},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000003171ff977345976f9caa10ca7443f40d6239529c6a3ccde69","index":2413393},"confirm_microblock_identifier":{"hash":"0xcccdddb332ed2bbe9707cc62154d56b54ad610027b56fbf8202afff3b4510695","index":1},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":742,"stacks_block_hash":"0x231a2a09ae9c72be1790ee07dc0f05b0131adf911b25ef8e3638091fd07369af"},"parent_block_identifier":{"hash":"0xe3571f1e6148be92c323c03ec24c63be5fe2534406640fa6018873a89bdb0b17","index":91213},"timestamp":1672327788,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x79667467766862)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x79667467766862"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":31,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000001f0000000000000bb8000166fdc179bdad55e110b5472fd80dd0cdc4e54657abff78cd449254c8e0cc91697605553c280ec82e75242ee51e99b276b8a2372be42090b813e1b06ec3dd964c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000779667467766862","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089704686173680200000000086d657461646174610c00000004046e616d65020000000779667467766862096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x1bd79ff3707cf877a51b2c4e17abaa2b50f129629da644d3fdeede41a60285b0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7074766e6a686a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x7074766e6a686a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f00000000000000080000000000000bb8000012d79342124537fe52dca89e72ada6ca9a90398ea1d53fa8577a342ae4dfc9b137049213f95fddb05b2e65efb5e5b94d29f22b50609168491b5327d9fb1190bd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077074766e6a686a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089804686173680200000000086d657461646174610c00000004046e616d6502000000077074766e6a686a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x12ad07821a4e08b8a432a25ff83be10b4544c0578b261256ae39d46157138804"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe546ca0d5e5c596354e2a9a0d0be937ca9a34da8a8cf1ad2238725beeaea595d","index":91241},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002a4b61b3cace27518fe0ef9277ed2c00727dc2f77904f8577c","index":2413420},"confirm_microblock_identifier":{"hash":"0x134493c110c1d47377ab6600244223699a3dd664509a86b12a596f200152ca85","index":2},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":769,"stacks_block_hash":"0xc66c4938452855ac10c0441a3a299957ceb643b670d25c3886fcdacad0b35559"},"parent_block_identifier":{"hash":"0x32d317b7b5ca77c73378171a9beb4923408753cc2432a6b35ff1965bf03822bf","index":91240},"timestamp":1672344961,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6466786263676e)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6466786263676e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f000000000000000c0000000000000bb8000195adf3b3fa1710f185ec4b9c898ef5775e8b03c996373b6855294a250f1d75b72ba7913821c6183cec033e6f4a943fc1e7cbb8c3de6482ccd8916d890f539289030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076466786263676e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089c04686173680200000000086d657461646174610c00000004046e616d6502000000076466786263676e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xe660d041e3a7466c38570758929ba49e06b5fbc1a170b34f63d2c69b288d93f8"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x667367676e)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x667367676e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":34,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000220000000000000bb80001f1974a1446620a857f060cf228e5942c36d5e385e7721ff719e7becc429936b10bd43d7cb8148ce73804a24b90a66315cffe1427d31d97084a518d04821c9c7c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000005667367676e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000089d04686173680200000000086d657461646174610c00000004046e616d650200000005667367676e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0xf399621f65cec9e62467edfb7690675ad08a4e468826d03bf4a5a6498570979e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd7a82c35c5742ee9e3d802642a4a9e64d428f5111405f5f354de5cdc42d239ea","index":91245},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000022af0bc2641803f5f8b6d2b5057047649ed289472d728eaed0","index":2413424},"confirm_microblock_identifier":{"hash":"0xa2def32c871ff665991391d9c960dd69ce68c8887b45fb60d4ffbc65a1ae1e2b","index":2},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":773,"stacks_block_hash":"0x62e4ea2c539408ed711c098193d1532bb93c93045134cb5e1e88d143c27f45f6"},"parent_block_identifier":{"hash":"0x891acb599711995b5372f57f615bc71505bc6103a81ab897311375f29cca7430","index":91244},"timestamp":1672347081,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b76736261646b6a7662)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a6b76736261646b6a7662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f00000000000000100000000000000bb8000171650abdad9e30f4f4dd15c79326248ac00d17de189c88ddfd0aba5e7bf6bf020adac5f6643cebb0e47ed38aef8739079c4a4aaf3c6cf2a3df9c0992269bc944030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6a6b76736261646b6a7662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008a104686173680200000000086d657461646174610c00000004046e616d65020000000b6a6b76736261646b6a7662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xbb0fb807276b70cb0ced9798d8306c91cbd9a90829f377cd918b0865349e70b9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xedec099f1fe544d0705639ee9df088468b8f53cd57017e75d624849d8fe1cbdb","index":91246},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002780313cb5fd3d1e200c4ec66c999f7dcedf585206ef74ec16","index":2413425},"confirm_microblock_identifier":{"hash":"0x378afe3b360b9467d484b9f3b22c095636c30b7b247b9074b6657c0ffa24c9ab","index":3},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":774,"stacks_block_hash":"0x1d25561f6469773baa199a29cacfa7073a1c06c8b102fa7ec07f596a9b1bbdf5"},"parent_block_identifier":{"hash":"0xd7a82c35c5742ee9e3d802642a4a9e64d428f5111405f5f354de5cdc42d239ea","index":91245},"timestamp":1672347357,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6577706f696e74)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6577706f696e74"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":38,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000260000000000000bb80000638f1d85784ad8f06ad2bd102abb08fa9a8ce133733cfd9316c44999e1ac401875045103fcdb31bd7cc4b4ce726196fc7c93bfe614a02012f31ddaf2cfc4255f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086e6577706f696e74","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008a304686173680200000000086d657461646174610c00000004046e616d6502000000086e6577706f696e74096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x974a9b2edc3a52570a8d93be452bf4042ad5887497f6593a40d19b57a735ea1d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x158c6fef20834af754d6257c502e3e8740b6305593b5d55143484e2d22941e61","index":91248},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000013e5b825dc51123d000b9f9b8af1f17bc9882f15c20cffa7e1","index":2413427},"confirm_microblock_identifier":{"hash":"0xc40b0583a8a9156cf81298306b87e74d7a6a5dbb0ac77ced84d0231fbe1285ba","index":0},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":776,"stacks_block_hash":"0x4fe2d48477a6c561f319dcb7fc5199b2c35510f909cce2746d4ea75df28ca410"},"parent_block_identifier":{"hash":"0x8e733968f54e41dbc26889253d943adb228ccca300c2a18e28ebe2b43755e0a7","index":91247},"timestamp":1672348809,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7366676462)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x7366676462"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f00000000000000140000000000000bb80000d7d1cc1b2292d061afbe20df54a8586943f0be3bce674f02b727fde8fa008fa718271b34db027b5cbe9429e5b466a75eea98a25c5774320c51fdf9b47193736b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057366676462","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008a704686173680200000000086d657461646174610c00000004046e616d6502000000057366676462096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xee35f9283ce00e7d7a7503bc73bb0d108017b93fe14a78e4a539fb1e91263789"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa82ed0a4e79599edfdc584fcf1b93b3e145850e750cae7bd395c2c495ef91366","index":91318},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000cba8867ba177831bd96775aa2f16f57f003cb5a11401fa9afd60","index":2413502},"confirm_microblock_identifier":{"hash":"0xfc9a56fd504150aeb4981161f2bbee97690e17cf7ee4613e497bd783fa72e1e6","index":5},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":851,"stacks_block_hash":"0x4e4ee2a7669997a298de1ac5e7b25d0c69984239155dcbeb33b0e51b73c62394"},"parent_block_identifier":{"hash":"0x348d51439f3cd5ed967e58cd4d8f308f16196c07d38c99c7ea9c46a273e09eb6","index":91317},"timestamp":1672392267,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364667366736461667361)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x7364667366736461667361"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":42,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000002a0000000000000bb80001c67f1d95f5c41e70faa9edf29fb3e69e5520ddf6568051c6dbbf2a36bd9879b32f61e1ac87d689a98411d730538d8d59bdff1607c2301ee041903f4135abc6a8030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7364667366736461667361","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008a904686173680200000000086d657461646174610c00000004046e616d65020000000b7364667366736461667361096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x1c00b96df55008e724043df1b69ca25c46c279fbf87c1eed702267f9789ffdbd"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe6832e220c5ea654f60015266572b5d3ef4c0b976bc0b827db64f191bb292804","index":91329},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000023f851eba3be870d1a2032b7ccdab646e5f971534773987b93","index":2413514},"confirm_microblock_identifier":{"hash":"0x178d8fdeb5d29c21c3a88ae13e93a33ea9a643271f43927657b3c83fcad90553","index":2},"pox_cycle_index":393,"pox_cycle_length":1050,"pox_cycle_position":863,"stacks_block_hash":"0x5eb47bc29afcc44ac5eb51800af08e75cbca3bc8a1a7829e574448c6ff39e934"},"parent_block_identifier":{"hash":"0xfc323ad875fc3e4374c9bec6f0d0ee1da56b668ac2bdd405a5fab074830f42c3","index":91328},"timestamp":1672399640,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6e6a6b6268)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6e6a6b6268"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":46,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000002e0000000000000bb800013e9106c0ac49823e9c9d0b3c95226448a1efc754831a7dd84d6490b637abf8a04006cb37c33021b616236f5857150c7071bcab0180909c90e0c97a358d95b886030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076c6b6e6a6b6268","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008ae04686173680200000000086d657461646174610c00000004046e616d6502000000076c6b6e6a6b6268096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x94933998ba897717ff4c59d38167d13df86937dda0ed08665c434e9470106ad5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6173637a7876)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6173637a7876"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":24,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f00000000000000180000000000000bb80001f5c1b9eb62874e740766dd988aa13459db7e989d12f3ceb881ebc60ad761c74001fdd8a77af4e28e6caf6263e77fe0a2a0a84e82ab5f5a12a71c86585f7b7dca030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066173637a7876","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008af04686173680200000000086d657461646174610c00000004046e616d6502000000066173637a7876096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x2e69c5e50abd5e144b85f696351fa701cc2c4f4951445614a14eef6d698e3c7c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1b6f5593f1b3c33f300bc91c26364f636b0b8da750327178e729b93c01fc5099","index":94592},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000c6a76fb57a3f8672abbabe760976cd42f226c70c1e6a60c130430daf","index":2417180},"confirm_microblock_identifier":{"hash":"0x773b03d7808b3a3d92711e8bcec05590a2a0fa21327451230d0bdad18a3bdbd2","index":3},"pox_cycle_index":397,"pox_cycle_length":1050,"pox_cycle_position":329,"stacks_block_hash":"0xa415db188b35e570cf3615f45b4e34230abd80caa59908af233efac58c2f506b"},"parent_block_identifier":{"hash":"0x0a75734a1f5f2bce262c529aefb48fe304cb85a64e44a932e684ee5f3302e70a","index":94591},"timestamp":1674193073,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d38)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x74657374646f6d38"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b82835677800000000000000020000000000000bb80001dc1ee70efa991b228ed216b4400a41a0a8e1d9647f4201b01c03218398207b0f2f0ab99296557be93f3f401bf25b6fa4a0fb33927e96bd50ca346a55749fa57b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000874657374646f6d38","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008c304686173680200000000086d657461646174610c00000004046e616d65020000000874657374646f6d38096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x7bbd6cc7ee83aa451d7d1cde7e7ad9ea6f09be5e1e8ec9e31a447b857bbd58e5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4f4d477c76cedbe8a5bb779b5dba430a10486b2062c14f35b2f1ec9b869723ac","index":94595},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000014b20ef449f75f3c015bcef0e19d302e440f9ecb4c183300dc","index":2417183},"confirm_microblock_identifier":{"hash":"0xa95ca4924b7c7200a6b187b12cd5b2b197cb6d87d4998b07969df46fff335c40","index":0},"pox_cycle_index":397,"pox_cycle_length":1050,"pox_cycle_position":332,"stacks_block_hash":"0xfaef028fc97dffd90ed4f7b9bb60a147ef1a03b5d268134ebccc655486c33d2b"},"parent_block_identifier":{"hash":"0xdab6763a3d12739e2c16023715cc98e83e3e4a1a37cc82fa3fc0d4b28615103b","index":94594},"timestamp":1674195177,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64646f6d61696e)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x64646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":53,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b4100000000000000350000000000000dac00019ec00a84b3733ef15d2eed368365d491066ace0205dca1b5616e266bffccc3d84e4d77259790f9337fe2fa289204c8eb1f9eb0132ff2b14d84634814b13ff43b010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000764646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008c504686173680200000000086d657461646174610c00000004046e616d65020000000764646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x50cf8cc1fd204cdcf96b4d604233667bf0a0003ddc3faee4eabf0115c244ea35"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe170bd05c3241a4486348e82c6f1c545068c7ba89284c7c7eae563c93e3a28fa","index":94606},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000159cb9f6c589c85140f551c2365ea5d33dd402945df5a7ef68","index":2417196},"confirm_microblock_identifier":{"hash":"0x17423a44d03a8a9ad591b6447c50fe06123b025728d0c1d8195020f290b4a9af","index":0},"pox_cycle_index":397,"pox_cycle_length":1050,"pox_cycle_position":345,"stacks_block_hash":"0xe7f5ee37a31875b47fbb3e09bb4a4ac737363cec4771dc385254aac5e9ce8708"},"parent_block_identifier":{"hash":"0xeb31e637e6025a0a517c63b8b467e5fbaa098b6746a6e9d23e3fd2e142ba98a1","index":94605},"timestamp":1674201871,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636a6b736c646a6e63)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":375000,"kind":{"data":{"args":["0x627463","0x636a6b736c646a6e63"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":57,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b410000000000000039000000000005b8d800008683e328ef382d30d127ae1ac75d36122acb7bc8864c7d55416395eeb47872986aca04d8bde19b47d99dec1f1ebd0395cfad192c1f8afd8a7372d901542b0904010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009636a6b736c646a6e63","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008c804686173680200000000086d657461646174610c00000004046e616d650200000009636a6b736c646a6e63096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x35441b3c77b3ba2184d81771183b4f0080392583d420de5d74bdb25554f62e75"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x87b4c9f84509174cc325a07312e6bfdcb698307210693cc30c82434ccd2ef1b1","index":94931},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000008149db6fdeb66545a76d2803fc514992a063ba3dd2b6b0cc865","index":2417534},"confirm_microblock_identifier":{"hash":"0xfabc256b770a0c6bdb0410b31b7d36fb26b0a6e44f7ed0b6f8c9773e08ffe637","index":2},"pox_cycle_index":397,"pox_cycle_length":1050,"pox_cycle_position":683,"stacks_block_hash":"0xe7c1012104e83c3f2b2c0c5895f3807489bc6706895921c5534e5d50bf64dc38"},"parent_block_identifier":{"hash":"0x02dd71e1c72c0b8d830b848345b7341b891b97e89c7216d6c57f8c13ff282602","index":94930},"timestamp":1674472017,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646664626462)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":75000,"kind":{"data":{"args":["0x627463","0x646664626462"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":63,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000003f00000000000124f8000081bb46f078433ef23cd1a5919019d81870500995261e55ea1390b87847ffbbfe614eebf4d6a97343c03f6b594e1bf5caeb821b886ff7c29036acddbc1e8a2cea010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646664626462","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008d304686173680200000000086d657461646174610c00000004046e616d650200000006646664626462096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0x125c862fbda42730910cc61d84e2b6af4c59466373650b3e37f1ca1137366e90"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe706379aa49e62c1e536c962c3b608abeb8655bd140bc828d4d2fe1d56474e70","index":95022},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000acd32c2780094b160b5244cb51c418effa439d2938ad2d32f","index":2417629},"confirm_microblock_identifier":{"hash":"0xf8a5c863461753dd0af684a10b212d3fb2693619b6a2f6d658f26f764b398bb5","index":1},"pox_cycle_index":397,"pox_cycle_length":1050,"pox_cycle_position":778,"stacks_block_hash":"0xc11bdb32a6388eb2c762ae1b2cb995a4e3f1c9d66fcdd7d6808126f9c142bc3a"},"parent_block_identifier":{"hash":"0xb62dc5d76a4faa40ac32de1e308b4452bae904556ff57d42de10ef1d5393e3cb","index":95021},"timestamp":1674551814,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b666e76646c6b666e76)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":6000,"kind":{"data":{"args":["0x627463","0x6c6b666e76646c6b666e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":71,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040050f802d54aad66d77d9e9b287d095c6880d92b41000000000000004700000000000017700000ea57db96e81f717ef19556cf48cb9bb3e28ecd9e3e14207f0dc09b36d0d54a4126de056b92f91fd4fcdfb4aed12073ab69d957f5d2e182720499f6cec8157199010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6c6b666e76646c6b666e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008dc04686173680200000000086d657461646174610c00000004046e616d65020000000b6c6b666e76646c6b666e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a50f802d54aad66d77d9e9b287d095c6880d92b41","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST18FG0PN9APPDNVXKTDJGZ89BHM81P9B868PET19","success":true},"operations":[],"transaction_identifier":{"hash":"0xaa77a9ebe1f5d0a98e7bc757dc663b0a882f49b43fc22e90d3146df31759d615"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x46ac216c096e8b52f71c215ce11f65b358750bdae2477c1b65c33b3b771332ba","index":95760},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000003b2415d394e8298e91f443878ef10f5e170304cc9cac57c2140c","index":2418408},"confirm_microblock_identifier":{"hash":"0x07911fa69f1e5646d9a0e05a63dafcde5a8e1e82c981933ea86a42b71d6a0bd9","index":4},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":507,"stacks_block_hash":"0x1fa2ac92ef599058737187faecd5703857c02aec5343fed938ea1813f3060b20"},"parent_block_identifier":{"hash":"0x1e2cb585595c3ae6c27250342eea04c78416a2c1a7c6b7f915bd69f78c69da39","index":95759},"timestamp":1675151187,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f69757974726577617a78)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f69757974726577617a78"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":29,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400c25beba5104f81c688de7a6a29da6d1ab881d40f000000000000001d0000000000000bb800019859b8a10951f42a5547e4459c87ff2386d816677c6d988721463fa2ea132c7661d17625acd05e8ed6f5e89b0f54da6f1ab0fae88aed5a87e65a12131e3f30db030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6f69757974726577617a78","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008f304686173680200000000086d657461646174610c00000004046e616d65020000000b6f69757974726577617a78096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac25beba5104f81c688de7a6a29da6d1ab881d40f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST315QTX5217R3HM8VSX6MAETDMDBH0EM1XN4G5KQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xd8536148bc13bd919140487a043d542a22237bf90b0470ef159dba60cc1ae6c9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x57e77d072bc2f784563f59e77b6d7186bf69a8273915b3804b6151fd26842257","index":95792},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000367e96faed24c5e6980ceeb65f2ac6049603c8208976abc10","index":2418441},"confirm_microblock_identifier":{"hash":"0xffcd609da55bd503abf3638b0daf48d9e742b10dda1b84a0179a855e16b2c203","index":0},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":540,"stacks_block_hash":"0x4b6377bc81d179a589661f86221784a80e187b35da292c1eb676b2d727e0d448"},"parent_block_identifier":{"hash":"0xdee7de27cd6e7a163d811f36ddb540e9fd05fcbe18501973cdcf017faf7ef2de","index":95791},"timestamp":1675179580,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6173636163767a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6173636163767a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004008435c694e51024d978ea3fb42971d74b8ff3df3500000000000000130000000000000bb800014773a1c06f82cc4c265096d4d54d84b1a99dc868d0c6f777e06a028a54dac849061ef4124a9aff8ff8057a8550bb2ca15a1e9df736bf6f168dc8201c8a6d72c1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076173636163767a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008f704686173680200000000086d657461646174610c00000004046e616d6502000000076173636163767a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8435c694e51024d978ea3fb42971d74b8ff3df35","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST223BHMMWM829PBRX8ZV8ABHTX5RZWYZ6PTJCWC5","success":true},"operations":[],"transaction_identifier":{"hash":"0x5b1ee33c5101430fb6eae9bf355f0ef4051ac2dbae33740a6dc38a0a9857baf2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x61f363b7181069832a2a05db36fe1fbc20b4b286c6fbc7a607d8e3e6f6596099","index":95864},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000060f86924c35449dcccb9dba24f2aba272590b3b6f5d42ad338c7","index":2418519},"confirm_microblock_identifier":{"hash":"0xe0cfeaf45bac60bc962e4eb9d49cb8fbc4d3f1e98da47fb4d502412e6ed9a141","index":2},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":618,"stacks_block_hash":"0xcb79e2b8422c4fb0d63566b78a11ec2b268823d379eacd3ef7628b32c48796ac"},"parent_block_identifier":{"hash":"0x20d3d56b946f887324325b05a4e5489060870b17f603e54f94735c2ed46bb93b","index":95863},"timestamp":1675236735,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6361736463766173)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6361736463766173"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b828356778000000000000000a0000000000000bb8000081445b5cf992c23bd807acbae9ed17c6c1be82f2b0e5e8a23db748c0db6d940f0291500f0f4226d46e7898301c6ea904b718f5e0b4644c7d04d2d6e2badabb2c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086361736463766173","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008fc04686173680200000000086d657461646174610c00000004046e616d6502000000086361736463766173096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x0f8779a83dfcdb9c9bb10c33727b6ed404e6f9ddc337a78d4250a54aee7796e5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x39c31d52d72572ec4c1566fdadc5b94f128c2bbb443a157b7106dc55deb1f965","index":95904},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000e65c1ad2deae3b04ef920caee221b0f0a8dbe8cdd986063aa","index":2418560},"confirm_microblock_identifier":{"hash":"0x805449977a15f1831c7e5725b9f841e0dd0f9107f406d94f14e9c0cc1d37ac11","index":1},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":659,"stacks_block_hash":"0xe1dcf739296c9c993427b8decfbbd24d3e1d366647f2be26ad49ab931ec3cd74"},"parent_block_identifier":{"hash":"0x4e031984836a7923051399076b856d248f506cb21fbbe3c33945b729f5e3d8b7","index":95903},"timestamp":1675270947,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x78686664677864666768)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x78686664677864666768"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400fd07ac2bb4feefb4fc6e37c6c8dae3bd0a25430400000000000000050000000000000bb8000034cd6959694fdd7ab0cd0b54c730bec2761be9ab5ba2ae62f733d6a3eb95761a6d64bcb9ab721d363aea2144f687508821d6550805d9b7b3d46d54bfe7cf4f67030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a78686664677864666768","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000008ff04686173680200000000086d657461646174610c00000004046e616d65020000000a78686664677864666768096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051afd07ac2bb4feefb4fc6e37c6c8dae3bd0a254304","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3YGFB1BPKZEZD7WDRVWDJ6TWEYGM9A30H4Q0PHZ","success":true},"operations":[],"transaction_identifier":{"hash":"0x653ca3ab34b4490b19e812fc8b48d9f967643b0fb6514fc8dcb90b44f633b587"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1adbfa9519ff2595f196a9e08c7c6436bd7d6a61fed741dbae216573c83cd1b0","index":95905},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000956eeffcb509066ad7c1f704fb6820c15845e938da9382e2f","index":2418561},"confirm_microblock_identifier":{"hash":"0x84fdb719408371e3f8b4f2e0401e795652dfdf6104ddd2bf7be78cf0345547e7","index":2},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":660,"stacks_block_hash":"0x5ba7954e7febfb65434d6950acfae36b004e23bb2663e3478801e2c691f365d3"},"parent_block_identifier":{"hash":"0x39c31d52d72572ec4c1566fdadc5b94f128c2bbb443a157b7106dc55deb1f965","index":95904},"timestamp":1675271230,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66676763686a646a)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x66676763686a646a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006b03eee67ea59d3aad6e1d7938744b195f8d3e2f00000000000000030000000000000bb8000152e18e43f4dc264ace13f821f106d35f886464a8d759a4bbed3e0d7016daeada266801af4cfcdbf49a1fbcbd12d97cf8bfcd3694e3c82b66f72d083d7623c82d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000866676763686a646a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000090004686173680200000000086d657461646174610c00000004046e616d65020000000866676763686a646a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6b03eee67ea59d3aad6e1d7938744b195f8d3e2f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1NG7VQ6FTJSTENDDREQJE3M9CCNZ39Y5ZC7MJBY","success":true},"operations":[],"transaction_identifier":{"hash":"0x4fc9e3b951b848a23bd20df4f8951d761c003c448783c5fbb1e62af0cc690839"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4d7c16c4aaab6aecc07983c8add0211b082bcfa0df308a0d975858c277524032","index":96001},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001d6c092900a4c762ed5e388fa0de520db477afe047531c155f","index":2418663},"confirm_microblock_identifier":{"hash":"0xe42d6865eb1d0bff777873b5f03aa4af147c01d8901b72d31ddadba848d702bb","index":4},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":762,"stacks_block_hash":"0x8641a3188272e7287d94d50db5d0d18f2462f041fceae68c75b7d2529bfedc6d"},"parent_block_identifier":{"hash":"0xafad405c08d18304726f0231d71003fafacb9d914447939d9813e80f1ba6ada1","index":96000},"timestamp":1675356069,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61617765)","execution_cost":{"read_count":16,"read_length":43992,"runtime":166996,"write_count":2,"write_length":155},"fee":3500,"kind":{"data":{"args":["0x627463","0x61617765"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400e14cac7d41bd3c6e0a823ae48274f018c9693ef9000000000000000f0000000000000dac00009e2861cd05d28f6af2df4e5bf016ab41a205c3a85848cba6530655dd4f66a631152785ad65433d10fc11b7072f46738f6760833fda9d27580162700265ace11e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000461617765","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000090f04686173680200000000086d657461646174610c00000004046e616d65020000000461617765096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae14cac7d41bd3c6e0a823ae48274f018c9693ef9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3GMSB3X86YKRVGAG8XE90KMY0CCJT9YZ723KYKA","success":true},"operations":[],"transaction_identifier":{"hash":"0xa3af533f0f21787daa03871ba70f0778414c20d635f5c4951ef97bf52b57ee96"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x41f01d6ec80d4fad9f5db1fa75d1db900510b4e4a97b786d031e73b42df3fdd6","index":96077},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000003cddaf34f6d99690dfb3a5f9572e5ee2062a80286a6d919ac","index":2418739},"confirm_microblock_identifier":{"hash":"0xdaba05bf193c5aca7d874aeca8084ceb426887dab20260cd03341b5760496657","index":2},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":838,"stacks_block_hash":"0xbc0f8f2f45f5abdd560de0cfc4fd3d999150d62308c1649eebb76c9ad2bf1c08"},"parent_block_identifier":{"hash":"0xdb87589fd851fb382c0956298609bbcd88d26bdd7d100bd4acf800c0c38719a4","index":96076},"timestamp":1675412662,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6466736766677468)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3500,"kind":{"data":{"args":["0x627463","0x6466736766677468"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004003535178d22e32b633587174d97ed4fa21642c4a200000000000000030000000000000dac0000a151c1b7a3e0ef442ba4fff30a9b88896db37cf0b09cf35623a645b28a585ef503c486b584999736b35196b21fe6230ea385bc92f8ce26073801ad4b727c6d21030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086466736766677468","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000091504686173680200000000086d657461646174610c00000004046e616d6502000000086466736766677468096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3535178d22e32b633587174d97ed4fa21642c4a2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STTKA5WD4BHJPRSNGWBMV5ZD9YH1CGP4M9PRAVVX","success":true},"operations":[],"transaction_identifier":{"hash":"0x5d54660640a497e08d50ad79eb69d31239746442ef4a73c6391f0f9874d3f629"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x39449dfb5107b7b8e79fbef8b5aa2a80657dfc87f422e69686cc81a8cf333dcf","index":96091},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000001bc1a718340ef4743a8085cede5fee073552c4cd59a911dfbd32e415","index":2418755},"confirm_microblock_identifier":{"hash":"0x4442a58a27507b7a7b5126880fce3aeb564bf57afd2660462249d0533ce2f554","index":2},"pox_cycle_index":398,"pox_cycle_length":1050,"pox_cycle_position":854,"stacks_block_hash":"0xf44415ee29693438ea857b91b3a647ba20b730e3831899c279cf6bea4248fbf7"},"parent_block_identifier":{"hash":"0x6afcdb07ed5ad072c71ae9fd740e97d7a0c849970dd7b552228589e9cf2c8382","index":96090},"timestamp":1675425917,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f6c616c6c616c)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f6c616c6c616c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":35,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000230000000000000bb80001e5f9d9cd22de4eb4f7d79a54f977b15b4f5d525374c05ed687ed337973cecae506e4b7d5b80efa6856975978e332954f060045e2088f1e4b66d442e2e6ed8e20030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076f6c616c6c616c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000091f04686173680200000000086d657461646174610c00000004046e616d6502000000076f6c616c6c616c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0x5b6b61dd3ce1562653bfbef142fd6bedba511a70c30cbcb44eb75383596984af"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xaf8b28974ebb5bb155a9a6c8bfcb502d8172949d3d347628626bbe18e2906721","index":96399},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000010d569d76f8d9e23aa518bb5b95c18158b02d47cf3f6f7739c","index":2419076},"confirm_microblock_identifier":{"hash":"0x115382c1d8ee96fa98cb1efc2873db9e29fcd05d2a9b94a71d7977c9c998f50e","index":3},"pox_cycle_index":399,"pox_cycle_length":1050,"pox_cycle_position":125,"stacks_block_hash":"0xda3c4048f56c016f0e5b342279ff5271411cd992ab91462214aab6db54e2ccfa"},"parent_block_identifier":{"hash":"0x32d5d92fdfd9f1fbc8ba54a1d499d39d7d3923ecac030650407e3b65600d3454","index":96398},"timestamp":1675665617,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x77646673667373)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x77646673667373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400cff965b6b4553644f65ae11651fbf743f3153c1b00000000000000050000000000000dac000010ef6a76926f11dc2ea3c0de9dc8513aa1c2613779bcbf862d6e8e519aecc0ee2f2457e3c7af43e6f386065477af2a647c542c56b11c1a9f594f5cee0b5d4375030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000777646673667373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000092404686173680200000000086d657461646174610c00000004046e616d65020000000777646673667373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051acff965b6b4553644f65ae11651fbf743f3153c1b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST37ZJSDPPHAKCH7PBBGHCMFVYX1Z659W3CY0426D","success":true},"operations":[],"transaction_identifier":{"hash":"0x60a6d67d646f1b11c26e5ce39eafbb764d57bf08999ead8e718c6fc6621e8584"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0e4f04f780093b360e4868879e535f6f3cfc871d323e01350523b220d3c2e169","index":96410},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000004f36e00a359fbfae2862548a6da0764820834d40b06a4dc6c685c","index":2419088},"confirm_microblock_identifier":{"hash":"0x756e98ee0207847b5217e7313f03bf4840fab554a9d99b7c20260a6b6ed322e4","index":6},"pox_cycle_index":399,"pox_cycle_length":1050,"pox_cycle_position":137,"stacks_block_hash":"0x45f71f03e13a393c08a3c1c1528627ff10ea3e6eaf1f03d5edf8034bf88814aa"},"parent_block_identifier":{"hash":"0x134e18167336fab13abfac38541557b4f782fd4be0042093a82f07fa099bbba4","index":96409},"timestamp":1675676074,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a626b686e6b6a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a626b686e6b6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b82835677800000000000000100000000000000bb80000b69c41fc9b351c36bdeae57b2c1a92be14010c7f213902d8f4909af86c80755e1115d0c998f61fc25a1b6ecbb0f4597cfe7b3301fdc73c00fccae2f8fb322ded030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a626b686e6b6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000092704686173680200000000086d657461646174610c00000004046e616d6502000000076a626b686e6b6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x413fcbec444fbb73ef840e1d3e4dc41783966866e77802ca262ce231ae940b71"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x44d377e8074b1473d1d89c87a4e86d837384255c9a8102fe670479a141b30aa5","index":96412},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000004f8607378bf5f3baa0e709751afbd8f9d673e49063fb7a49f52","index":2419091},"confirm_microblock_identifier":{"hash":"0xadbee9cc9f48154bfbce1ca7a7a3c1d9fb06e9022882aa29e7ac091c676487fb","index":4},"pox_cycle_index":399,"pox_cycle_length":1050,"pox_cycle_position":140,"stacks_block_hash":"0x2bc5ec8b3881f26c5523a6ff4d61442b810fef5c844b023eec1e3d855f38437a"},"parent_block_identifier":{"hash":"0x1cfc7c1c8d702f097dd7d7a100175d4b2f1f43446d520720a3cf3ae38137dfff","index":96411},"timestamp":1675677901,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a76637276)","execution_cost":{"read_count":16,"read_length":43995,"runtime":167035,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a76637276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400be72b3bf0c3ea8f18ce0b6813f0f909631782bb900000000000000070000000000000bb800011d3cd431fe2dc9cb02111521c272e8d2e9db549a5078a1b842443dab962621061e6c248d996780e4983e657455b1471c873c06c3f5833d52f36cf5c3a982f9a9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056a76637276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000092a04686173680200000000086d657461646174610c00000004046e616d6502000000056a76637276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051abe72b3bf0c3ea8f18ce0b6813f0f909631782bb9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2Z75CXZ1GZAHWCCW2V82FRFJ2B32Y1BQ7FBNPYF","success":true},"operations":[],"transaction_identifier":{"hash":"0x82c2a2231032973108f5e36772d3e4c703f9978cc697e18d4fa0e85a7b44e5a5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a76637276)","execution_cost":{"read_count":12,"read_length":43966,"runtime":131782,"write_count":0,"write_length":0},"fee":3500,"kind":{"data":{"args":["0x627463","0x6a76637276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400be72b3bf0c3ea8f18ce0b6813f0f909631782bb900000000000000080000000000000dac0001af5a6fa55c010d39d4d4ec0050b5a54f7b23c612aeaf97d9abfa0b43301791445f427b6c3ba8353bbeb4471713665ec4cb68f3d89c261e3066b2404902d39c9f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056a76637276","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST2Z75CXZ1GZAHWCCW2V82FRFJ2B32Y1BQ7FBNPYF","success":false},"operations":[],"transaction_identifier":{"hash":"0x40a7dfc7b5d8033c635d11fd39d7d4a58f191b5bc0836aadbf9aa44ebca2381a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x77cf10c16c916311b6295dc7e4fa4eb948112d7271c522c6208c6bcfe3868691","index":96453},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000001ab128735d0549a43be46d71678369c8e8badd81dc95de0f86964","index":2419134},"confirm_microblock_identifier":{"hash":"0x84d6ae79e3f5372e7a7638c83fe327294faf61ff52bebef0bbfb2577f335eca2","index":6},"pox_cycle_index":399,"pox_cycle_length":1050,"pox_cycle_position":183,"stacks_block_hash":"0xfb9e65f1fda1c551bba554ef67f3bdc6d5ddc9d78bad56b28de6491d092e9644"},"parent_block_identifier":{"hash":"0x79d06882d9266d19f0b0437255629d210a84cb8900b53164d7f191cc8cc46a3b","index":96452},"timestamp":1675719533,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x, 0x)","execution_cost":{"read_count":4,"read_length":41790,"runtime":48227,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x","0x"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":40,"position":{"index":8},"proof":null,"raw_tx":"0x808000000004003aa67c55c8c978f19454c3b15e5307566e50d52a00000000000000280000000000000bb80000f02e9e387aff1f40e7aba9c32d93092c03c9a0f0b9d03d901968b2ae67e8d6d34b3a1bbc1283d647f0aecce6fbfe3a097ae84e08b68ead492eb7e7cdca902a80030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000000200000000","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2013)","sender":"STXACZ2NS34QHWCMAK1V2QJK0XB6WM6N5AHY0TJY","success":false},"operations":[],"transaction_identifier":{"hash":"0xaf0206e6502e9b5e296d866ab8166e42203b2f7d5cb2045492b86219907452e0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf19cede06053ce090530af19a67d908b009fadefd4c3a89bcddc61accedd1ffb","index":97270},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000acbea0b2c70ad14020d4687d353720bd0653f6a9d006cd2e33ae82c6","index":2420005},"confirm_microblock_identifier":{"hash":"0xdcd3fa9fe20a0a92eff4659f852a1c1b7f6a84b5be03d71a112118e63a63b592","index":5},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":4,"stacks_block_hash":"0x6ff12243842b80ed06a086b9498d5fb1ee2658d5fea0caed151e2366568d194f"},"parent_block_identifier":{"hash":"0x4fce9b25c2b8bfe38656a25f730de1f3882aac81ea75625f3429aae72b2dd3e5","index":97269},"timestamp":1676372112,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6162636465666768)","execution_cost":{"read_count":16,"read_length":44004,"runtime":167152,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6162636465666768"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004005d35a7e8d4600d0285ec0b3a97f764c750e415d4000000000000000b0000000000000bb800014fbf78f90744b2edac2ff16e2edffbfdf8c72e4226f430c9afa39682f95c7aca7d92253ea9c4617715c6eb997ca867f82a9f1881290e5fce718c96ff0905726d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086162636465666768","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000094804686173680200000000086d657461646174610c00000004046e616d6502000000086162636465666768096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d35a7e8d4600d0285ec0b3a97f764c750e415d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKB9Z8THG0T0M5XG5KN5ZQCK3N1S0NTJ3R9R4W","success":true},"operations":[],"transaction_identifier":{"hash":"0xe3b5778380d71d29240107af10770a901dc0c854c09031415e5c94ef03aa2887"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1e888f6745b152d0c7a938ce1b7e925d16d7c94931b7dfabb60cb5fdb6130524","index":97348},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000353ac32d100c0db3f3559619dd925369bb4e937f8b942ab7ff3e","index":2420086},"confirm_microblock_identifier":{"hash":"0xf7382d369ad6751be53df99169f5232cc79f68151db27a6ca6f259637d58d201","index":5},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":85,"stacks_block_hash":"0x91956e0dc1e60a252db792b9841c474a5277c46cba15af744d1a8a6be311b5f6"},"parent_block_identifier":{"hash":"0xca62d4d1b4f02bd719e02ef12759257bbaec31d1fa69050e351a4bb51ff7a04f","index":97347},"timestamp":1676436177,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646667)","execution_cost":{"read_count":16,"read_length":43992,"runtime":166996,"write_count":2,"write_length":155},"fee":3500,"kind":{"data":{"args":["0x627463","0x73646667"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006eae96ccc5f772aea645fd31ec4101cddcb0882200000000000000050000000000000dac000194f47668ad250f86fc36cfcec24ee50f74e0b22a50595d4ea6032ec9d325e11a7642bff6f5868ff366906c7b7f31ac8f4c8df18e8c6923bf70998d11c5c88c0f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000473646667","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000094c04686173680200000000086d657461646174610c00000004046e616d65020000000473646667096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6eae96ccc5f772aea645fd31ec4101cddcb08822","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1QAX5PCRQVQ5BN68QYK3V21076XSC484AA9ME7P","success":true},"operations":[],"transaction_identifier":{"hash":"0xef4f1f8db828a2673079f44caa5e4dc23e79840b48e45e078cb13b488ab27cd7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xef47886a5d8999cb29755d5b9f99741a73f0bc3772b82af8a0226d0948e46d6a","index":97358},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000003baee03f66f5ac87136afe54ce6bee4a0506671a6d7f411b0","index":2420096},"confirm_microblock_identifier":{"hash":"0xbaef5005973324614fc8b538c63beeaf740a3735a847ce964b413e2fafff9bca","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":95,"stacks_block_hash":"0x9ac00646364e69d23909c2c83964425eebb268f5050bae8fdbe33af899812b8b"},"parent_block_identifier":{"hash":"0xe520a1dd878d21de75d297a93efc69d3ab9906749057c39fc2ec275b3c587bf0","index":97357},"timestamp":1676444404,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646668737268)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3500,"kind":{"data":{"args":["0x627463","0x646668737268"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004006eae96ccc5f772aea645fd31ec4101cddcb0882200000000000000080000000000000dac0001a8f9bfd74bbcb51bc6166f89926de7bb6ae9c4caf5f3904a098bd393b1b46de506bdb5da4c96a44471161c546e250cf9527b50ff3de37a6c8a2a7bafdcfcfba6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006646668737268","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000095104686173680200000000086d657461646174610c00000004046e616d650200000006646668737268096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6eae96ccc5f772aea645fd31ec4101cddcb08822","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1QAX5PCRQVQ5BN68QYK3V21076XSC484AA9ME7P","success":true},"operations":[],"transaction_identifier":{"hash":"0x55fc4acdcbabaf7f3f294c62827a1637ba3348b61cea44c3e8fe99cba9fde36d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4f2736cc2bcaedf50b4b61bed0481b37f26c17884e04dbb8a9fd8f37f2b2e3ba","index":97369},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000048e709b94d73d60a9bb6bd9bda4beb91bea76fc68d94c4e3a4c0","index":2420107},"confirm_microblock_identifier":{"hash":"0x7fe05fe6481d76030f1cfd878607fae216459110d1f71550173b3374372d41b7","index":5},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":106,"stacks_block_hash":"0x31e26a860964a8abbeca0a6db24ec1cd6900f8053c1ca9da201ed736007eaf1e"},"parent_block_identifier":{"hash":"0x63dda231387c8e862dde09e05857a2eebd4303b35333a89038ea8707ce5fa4d0","index":97368},"timestamp":1676453109,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626276627662)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x626276627662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e00000000000000000000000000000bb80000fcdcc0791a77eb32a0029a368483f7cb0717547311dea6519ed9630b3bb6ea81131d4785520c831de5d95263e0ac0ab09b023f4e7b3883390286ee91b0c66ad1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006626276627662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000095604686173680200000000086d657461646174610c00000004046e616d650200000006626276627662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0xaa4f711666e41809c1092c4b1706405ac483b366c37e8cd3dcadb4ca9a0578e0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcb68634667180af74a705ee8bd2301c5e286be40594c64161d9cd5b3aec2e92c","index":97463},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000007c4b93244b22b97d16a8340d6d1b156cbbd506700a25ec5626688ef1","index":2420214},"confirm_microblock_identifier":{"hash":"0xbcd339b09764fea2e871d13419371cb789c711fe7e1628917f01223295c70c76","index":2},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":213,"stacks_block_hash":"0x4aab22a829fb697ec014f57abbdeec7fba93e38526f945fb78fc5c78130c2d67"},"parent_block_identifier":{"hash":"0x1886a2bf1c843f59d93d90cfc21d9937b336697c0a39daa87ea4574523bd5305","index":97462},"timestamp":1676525537,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x5f)","execution_cost":{"read_count":16,"read_length":43983,"runtime":166879,"write_count":2,"write_length":152},"fee":3500,"kind":{"data":{"args":["0x627463","0x5f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d6462b51d347951dcc22875b768058bf63e839e900000000000000020000000000000dac0001f4315a1a795eaabffe85501104c6ab913ff5a434f028a3cea5083347c4080ff45615ef6da026bf06360f1f8e81076699c890e5f63d37556ea3bf0c7ba014c3cd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000015f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000095d04686173680200000000086d657461646174610c00000004046e616d6502000000015f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad6462b51d347951dcc22875b768058bf63e839e9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3B4CATHTD3SA7EC4A3NPXM0B2ZP7T1SX52X7SRG","success":true},"operations":[],"transaction_identifier":{"hash":"0xa646bf8374039f86a079545321784df487b6a0d10b62a0da9474019ba49bec59"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbc107bea02208757328fbfd5b3ae39c2584d9451c0844cdb56ec6b2b712b4b03","index":97478},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002b5a16ac196a27158dc41768e82642106eb5003513ffbcffe7","index":2420233},"confirm_microblock_identifier":{"hash":"0x413cf590b1e0bd6c1a83d31bc2ac9b1bbf4ddb5a5cbfeaf2f90af65781ccfbb4","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":232,"stacks_block_hash":"0xc59e0113811ea289e7eda88d64d8dbd05c770c21b8efcfefeaba6600c5fcbbcf"},"parent_block_identifier":{"hash":"0xd40f9d739fe4a7dd568d1ba1f63326b3b2861e64e5319fbd1fe1510519c3e3b3","index":97477},"timestamp":1676537782,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7866636776686b626a)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x7866636776686b626a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400d5c6df928e2d295d44682c942c230f42ce64f56f00000000000000070000000000000bb80001723f8ea56467a28377b408923c73af69f06ba65d691da117c473d49a726ad28477a09f34f60639893e41a22979becccddb26eccd5364f4acf0b430304b2e6a2b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097866636776686b626a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000095e04686173680200000000086d657461646174610c00000004046e616d6502000000097866636776686b626a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad5c6df928e2d295d44682c942c230f42ce64f56f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3AWDQWJHRPJJQA4D0P98B131X1CWS7NDW9X3S18","success":true},"operations":[],"transaction_identifier":{"hash":"0x93186ed616fc3f2f753a2b7665b934a73282d732e4dd9ac0b42d75baa7ac72af"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3866d823680b0b059999e9af5828618ce56aa5708fc21de394cbdf6ef4d1eae3","index":97488},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001d2c07c1d52fe05f2419afbde21b1a2a25dc17d6ae283c7735","index":2420244},"confirm_microblock_identifier":{"hash":"0x1297c45568b01ac9630a41d11f3fefa9e1e429a99f8019acb35ad9ae86833f0d","index":1},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":243,"stacks_block_hash":"0x4d0989f15a9be78d693b85e0b022fca1a58ac85a582fdb38cafc8b50ed376923"},"parent_block_identifier":{"hash":"0xdad5eaef72e3643018d75df66060ee4eceff2d2fbbcd9ba76a27927b0abb58f9","index":97487},"timestamp":1676546387,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616b6a63626173636b6a62)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x616b6a63626173636b6a62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400d5c6df928e2d295d44682c942c230f42ce64f56f000000000000000a0000000000000bb800008f4182e2700374b86cad9453cd7232f9ed51a48437f71320b99bd8b1ec5e605666c3b5debd56192a518ff75ed256d212f7fa45ba19cafe41720684d62a7b7fca030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b616b6a63626173636b6a62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000096004686173680200000000086d657461646174610c00000004046e616d65020000000b616b6a63626173636b6a62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad5c6df928e2d295d44682c942c230f42ce64f56f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3AWDQWJHRPJJQA4D0P98B131X1CWS7NDW9X3S18","success":true},"operations":[],"transaction_identifier":{"hash":"0x3ae9772c13a021dcbafbc986ae43436e97c0e9829687e798f1d96517fb64c12f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x41baee773ad7891b956dffc76f8d41cafb1f5d9d4c371a9ae47bfe6a677a1419","index":97494},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a7081d75f996e3488e52ca018a6e7d5a78ff064e9395a1080","index":2420250},"confirm_microblock_identifier":{"hash":"0xa808e1d9613f14b9f5c2e01fd9803e078810a92c540432f0ddcdee1a9ce2e582","index":5},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":249,"stacks_block_hash":"0x27c7b80ca73a4ce754f3a50f6633ab8efbd802066f95ee34374e4391917311d8"},"parent_block_identifier":{"hash":"0xf3b1d830fafc451d27f6ea6d8bf25bb2e40760279643ba667b3134147541dae1","index":97493},"timestamp":1676549710,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a646276736c6b6a646276)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a646276736c6b6a646276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b5100000000000000000000000000000bb8000144ea438596668ef5706af34ea93d515cd9df263f31dfef07455bc0a1f9ff87336a9c2cca9c984d4a5fdf5acd629ef624f4482ad97341ed76497293270009193c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6a646276736c6b6a646276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000096404686173680200000000086d657461646174610c00000004046e616d65020000000b6a646276736c6b6a646276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0x0d4380ccbc88349df2702869d62aa33d3a32ff7dab275449c7bdcd0ee6c68f8b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa92a874e1faad057a880c5df6bde1ab70c8f00fd2f6e778718ed128f1d0a1ed2","index":97497},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000597664ea3d82151d03b7aef878ae38dceb78004202ea56652","index":2420253},"confirm_microblock_identifier":{"hash":"0x42c27dbcc54953e26e88dec03a23d50a2c7e3b613a9cea55a6320210deb50fb0","index":3},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":252,"stacks_block_hash":"0x4704b8c15d0ccfc720d2b1e633a42ea942830fb7660dc7fd8e78c7c09bbd9a2c"},"parent_block_identifier":{"hash":"0x2b1200581b82407b65893ddce5417334561902997734b511c386074d2dba5107","index":97496},"timestamp":1676550830,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646a76)","execution_cost":{"read_count":16,"read_length":43992,"runtime":166996,"write_count":2,"write_length":155},"fee":3000,"kind":{"data":{"args":["0x627463","0x73646a76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b5100000000000000030000000000000bb800012b1e8b5e5eab371348657f4061afbd68add5ad73379794c20815e0a3142205ee2d13e966876152e833171f71a68220b7500dacb23677b6a399f57ce9c742a2ed030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000473646a76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000096604686173680200000000086d657461646174610c00000004046e616d65020000000473646a76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0x112dc72a1c2ad817e88eb14a0a5cd44a26d509b89ef9358574a1a2ed959a707b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc50ee516fa6f6303474f3629841cd67d123f6896bc9e458b6c0925a3a6e44620","index":97499},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000814e6f7734c9ef543dbedba876dac6724d6bf016b2e9e72b5088cf6c","index":2420255},"confirm_microblock_identifier":{"hash":"0xaadb094016eb1e3dc430a1dbb832e219017687a02ce14758b60e06b0318ba133","index":5},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":254,"stacks_block_hash":"0xd361d5ed29c96fc617f7eb7b978339e8d1fd7e282708a62578e454c225658aa9"},"parent_block_identifier":{"hash":"0xaebff3f468522b9009ff7885ad0be535eb90ef772561928c8aeb1859c7af31f2","index":97498},"timestamp":1676551611,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6f6e6f6e6f)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6f6e6f6e6f"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004006684c7aac54fb4eb6ce79b232102f1522560ffa000000000000000030000000000000bb8000096c5313b5a783bddaa414091c463eaf087626ece1cfff05cf0844d2a518715432dd109c723918c1758fafe7195ce76b578db297c83d5de3dca8ad1a1ca516f89030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066e6f6e6f6e6f","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000096904686173680200000000086d657461646174610c00000004046e616d6502000000066e6f6e6f6e6f096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6684c7aac54fb4eb6ce79b232102f1522560ffa0","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K89HXARN7V9TVCWYDJ6882Y592AR7ZM0WDV711","success":true},"operations":[],"transaction_identifier":{"hash":"0xcb96c0e600f0959101b0be521b31475bc0a66ebee282946247384f9fe290d74b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x26dec9f35559e6617d9c63a3943ce389e648889ea6a67bbc28ce6211f95883f4","index":97614},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000009bb8b1f83a78437a67bd5a53086aa69f8bc2c048cfb53cb802b53d1d","index":2420379},"confirm_microblock_identifier":{"hash":"0x90507655169ddb1f6654226fa24409202eb3b61cb0dbbbeff32f9726a0f78380","index":3},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":378,"stacks_block_hash":"0xb77693c2af721e7de16cc12db27b2f712c5efdc0c58d2fb16cf624ed950eba8c"},"parent_block_identifier":{"hash":"0x101ac93d3af1e8b43d4a67b50902c66d645926c670437ab334d15d7ec1d6f6b8","index":97613},"timestamp":1676630625,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b6e7667686478667a7364)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a6b6e7667686478667a7364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006684c7aac54fb4eb6ce79b232102f1522560ffa000000000000000060000000000000bb80000122fa611604b6cd7961102d33152578fa8e6b1a830307e5094802f161189f5444b656d841fbf0cc52997dbaebd9835684db20c9d128984262dc333fb93745f91030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6a6b6e7667686478667a7364","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000097304686173680200000000086d657461646174610c00000004046e616d65020000000c6a6b6e7667686478667a7364096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6684c7aac54fb4eb6ce79b232102f1522560ffa0","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K89HXARN7V9TVCWYDJ6882Y592AR7ZM0WDV711","success":true},"operations":[],"transaction_identifier":{"hash":"0xba2af731b03fab9dd0942bf274c18e3a98d1c54e67ed04c224b885d2ad31aeff"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x75d3d37322f9afb975fd07930a6bbb7e25fbb41c4e51bb4bd24e82f1a7cd933f","index":97622},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000213ded2dd8bcaf436321704d08887878582addb17d6559657d","index":2420387},"confirm_microblock_identifier":{"hash":"0x3b19f4dff8083a2d8361a89fb18cc17baef551969c1a8b118e07ae6d0803f18f","index":1},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":386,"stacks_block_hash":"0x3ca09da4e96b8401f3cee7019080664b6a7c9b29508684c1330c453833343e6e"},"parent_block_identifier":{"hash":"0x0b11fb684da82dcad09e6bab062cce9cf2e119af06335e3292b8e8a8398914c8","index":97621},"timestamp":1676634734,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f6975797472657771)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167230,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x706f6975797472657771"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004009eb1c9dc5a00931d4513a495cc213a1662b2b7d9000000000000000c0000000000000bb80000b95a45ab5779555feda17c09ea83344f18e601a20f1ee6a38ffdca3eebbf41fa30f9ef1387238c55e18667c825da6cfc874f1d5d92e2b98551e5790fcd896f04030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a706f6975797472657771","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000097904686173680200000000086d657461646174610c00000004046e616d65020000000a706f6975797472657771096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9eb1c9dc5a00931d4513a495cc213a1662b2b7d9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2FB3JEWB80967A52EJ9BK1178B65CNQV6YR5B3R","success":true},"operations":[],"transaction_identifier":{"hash":"0xb51eef3b5fd20b895b055aec9dfd6e1b1dab4d6461544a3e0b05f231d6d7dee5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb961c6be8d37f4db51c8162a8f9c191e0eb5ffb3e0f3eaa4d999b62d81a84b86","index":97892},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000128c251c3bc7177df14ab069869f9b3440a0e31d9756c4167e","index":2420702},"confirm_microblock_identifier":{"hash":"0x4f79a19da8c9b360799a2acd9334813d0f5e35ed3291bef1ddf94a98ded01e40","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":701,"stacks_block_hash":"0xa0bc4cf3f3c5575365a39d8ff0692f7551e25946ec696c89155997fccb263468"},"parent_block_identifier":{"hash":"0x23302ae2195c9469de3c551c63f751dc130774b6b69c82086347d4ca282e13b5","index":97891},"timestamp":1676843044,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d34)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d34"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400c04fc57bccee4ed146d79a4be5bbbbffe067735d00000000000000060000000000000bb80001607e732622dff356e626fa6bbeb65c1b5b38322e324a1e82ced6268b9ac511a9467880b5c6e594bd104599e3b77e1dbeee61e98e5e70ec05b44efedec8dcb84c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006312d74782d34","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000098f04686173680200000000086d657461646174610c00000004046e616d650200000006312d74782d34096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac04fc57bccee4ed146d79a4be5bbbbffe067735d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST304ZHBVSKQ4XMA6TYD4QSDVQFZY0SVKBNNKPQB0","success":true},"operations":[],"transaction_identifier":{"hash":"0x2a0890c80f1ec80f2ad6eb77465e0b5841d95f73199f92f8b07151b431080d2b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9fb4a38594d91354b9bba5abfbcf587f02ed63bf5fe2e9ac130a851dbbc7b3de","index":97947},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000094c26e4be8051559b9c6f78ad1d2a470d868122ce6c5c9be8dd9b3f8","index":2420758},"confirm_microblock_identifier":{"hash":"0x97c9b47fa510c97002e133fd88471ae090dd2fb3139d5a7003eda32efba6cb25","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":757,"stacks_block_hash":"0xe3d170ea05de2be537c6c62702e6151d981e27eff23df325328558ab8e0139bf"},"parent_block_identifier":{"hash":"0xcf8d24d906bb3de500c7b92e0357e32ac6bc501ba14500ffcae9c845df3cd290","index":97946},"timestamp":1676878576,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a62686a766763667864)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6a62686a766763667864"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400234be811e63690e480f7cab613abc826d0f4afa800000000000000000000000000000bb80000dc307fce3ffb2e73835c0e90c897939fe697f379b46984ddb8065d796b018a066d48e8b850d42c3f22b30afd45bae5f46b1932b66e4e1fd060398dbec9835be9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6b6a62686a766763667864","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e646578010000000000000000000000000000099b04686173680200000000086d657461646174610c00000004046e616d65020000000b6b6a62686a766763667864096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a234be811e63690e480f7cab613abc826d0f4afa8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHMQT0HWRV91S40YZ5BC4XBS0KD1X5FN165QNV6","success":true},"operations":[],"transaction_identifier":{"hash":"0xd25cf3b28007747fb8fbb33fabb0f6623acbc6e3475c07d78ada36a6abb722a3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2cb8ca8284d78ac3d9a7563e134de104f8f9618091820b0dd6cc215011ce9971","index":97972},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000245e4be5a39b42bc2b13599dc91d9a9bfb5e92639c47d55293","index":2420788},"confirm_microblock_identifier":{"hash":"0x007a23ef197f5d2c56d529b53acf6f22534b11faf68a81879175ecb5fdce1424","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":787,"stacks_block_hash":"0xabe9a76e8c564f2a718478af0928d8d214b9ff8e3300c2fcdd5cbc4513dca142"},"parent_block_identifier":{"hash":"0xa8ccd6419e03552fd0697ffcd09188cd58314de3fae4cf8ea8c238a0631df21c","index":97971},"timestamp":1676897779,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6c706e6b6f626a69)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d6c706e6b6f626a69"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":39,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004009eb1c9dc5a00931d4513a495cc213a1662b2b7d900000000000000270000000000000bb800009403611874eb6bd8e755c50b81a0fee123515743dba500e9f5e6c52a616f51363d7c3c23bdca0872ae8b4b396ad45939f1b7393595416584946fe64b76eadffc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096d6c706e6b6f626a69","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009a504686173680200000000086d657461646174610c00000004046e616d6502000000096d6c706e6b6f626a69096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9eb1c9dc5a00931d4513a495cc213a1662b2b7d9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2FB3JEWB80967A52EJ9BK1178B65CNQV6YR5B3R","success":true},"operations":[],"transaction_identifier":{"hash":"0xd5a26a5edaa55c00f6c4ca5f0490c007c84505364a10b5dd14c6f584ce5a2b7e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd80d6136c949e573499b7cb461c056dbd921e8625d144a5cba71054af633e32b","index":97990},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000025c1e60e2f5e7ab2e35c5c3e65e80ef50d63696f9b63c8f6bb","index":2420807},"confirm_microblock_identifier":{"hash":"0x5ccf4aac6f6c0a5a0d9f0056b4c2553079aee933d7717c99fdd5096a433522ed","index":1},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":806,"stacks_block_hash":"0x34997d078e40e90100bb77c149dca100e0bcf5b32cf501b9e2ba49cd3f6eb80b"},"parent_block_identifier":{"hash":"0xb22789f0cf6e1c7945313f8a0ff092a61a1d486190efd7608ad08379cc8a406f","index":97989},"timestamp":1676911064,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x78636d766e78766c6c)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3500,"kind":{"data":{"args":["0x627463","0x78636d766e78766c6c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e00000000000000030000000000000dac0000da018ce611a65c81ce5b8ea2bfd0f0df82afc45e4d8bb93b119f46c789bfc0872d5ada559b3c16f67939a9be491d5968d90a8833846008a7fc4cdda16b548af6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000978636d766e78766c6c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009a804686173680200000000086d657461646174610c00000004046e616d65020000000978636d766e78766c6c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0xb246d4cbc714346a12d064aa8e3d5cdd63b30369df1991d64a6c0977b573923c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbfc59607da61969a7c02f3654f699e0c016f58c20b548616c24bf58f574d20c3","index":98065},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000252e8c09da04db485f4add6bd090dec234ca81829463ebc082","index":2420886},"confirm_microblock_identifier":{"hash":"0x5484ab96bf312754f0dba74974fb41b6c1a8ea6e38ae728a1cda0f4d8dddab0e","index":1},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":885,"stacks_block_hash":"0xe80d93c4e89c7e9492a9d2b3c501b0dfb14b8525d3b08dbaae4c16f9dd4d4063"},"parent_block_identifier":{"hash":"0xa92a7d01c2dbfb581a8b36414c7530d07759ad8fcab714ddc552dfe3ad9b2edf","index":98064},"timestamp":1676961297,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x68626a697574726473786376626e)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3500,"kind":{"data":{"args":["0x627463","0x68626a697574726473786376626e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e000000000000000c0000000000000dac000055a273dedd2d45c4f9cb4e24b6379aa4bcb55cc470464a341f67a959bb047aea7e59f98e3e86764883c5426f1e22ba34889fbf226ad389df364099e2c6549c51030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e68626a697574726473786376626e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009b004686173680200000000086d657461646174610c00000004046e616d65020000000e68626a697574726473786376626e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0x7db7b5723ff63f6f1afe9769d7f3cf9a75ed911084559f7e299c9cc1dec57f7d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfbbc1ffa959095c2630bf73f2839dace1b1394059ebae4a389c0b3d0ece1975e","index":98078},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000019c2ac099f8051f2bfd84cebd4b8b6bef29fe742db874b8013","index":2420900},"confirm_microblock_identifier":{"hash":"0xf8a1d4b03dbe9bd2b56ac6c5bbc2b6bea1bef1066a88900afd03bf09fbe5e446","index":4},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":899,"stacks_block_hash":"0x3a702f70f39d46fa6e3b0d0842883e008e28a17e440f96c064d73258e6d4819f"},"parent_block_identifier":{"hash":"0x5bdeb187f48981cbdec42f7767df47862b4a72eb1fc9f7139dc0d34eea57c3fa","index":98077},"timestamp":1676966093,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736a646b766273616b6a76626276)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x736a646b766273616b6a76626276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e00000000000000120000000000000bb8000088854118aee8222175f95768111d24da8c3d0803a87642b2bb94bd9d7df16d5f489a41a657744fa6341c9180bec7b495c7764f7818dbb6927ef711cce9b1cb6f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e736a646b766273616b6a76626276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009b504686173680200000000086d657461646174610c00000004046e616d65020000000e736a646b766273616b6a76626276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0x032a13d2cc6a63ad03ec3cbc86632c6531d4165e50943270b0a066e0ae379d9f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe36d5f33b51f96cc9df304eafdac36a0036f56bea11d9a5a2085868a45193eb4","index":98100},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000008b6bb1b5d78b56f97e08dd243c0361099e4a3acbd9c40cb63","index":2420922},"confirm_microblock_identifier":{"hash":"0x3ed6d13d3a8f7f2de49e5a57453c11697c1b568b277ae413d7a535494e1c9c67","index":2},"pox_cycle_index":400,"pox_cycle_length":1050,"pox_cycle_position":921,"stacks_block_hash":"0xd974dd1f8d65def25a372e3544a5797cd70b7edea9164e3f1d636bed59a9fb26"},"parent_block_identifier":{"hash":"0x6b4b199c598bf9da324b0105247ad7ccd3af69a3d51d061a6aa2e90257b10ec0","index":98099},"timestamp":1676978926,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x626876676366)","execution_cost":{"read_count":16,"read_length":43998,"runtime":167074,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x626876676366"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004003092ae481d8cdccca6680519d75151f801c98d6800000000000000070000000000000bb80001f7f00c7b32da18d397a3199ec22be06175d1e005f918b99f59b70a82e64923100df886ace3620c7e43096aeeb3ff1a53a12a0527c7bddfb62cfdd73203054ac0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006626876676366","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009c704686173680200000000086d657461646174610c00000004046e616d650200000006626876676366096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3092ae481d8cdccca6680519d75151f801c98d68","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STR95BJ83P6DSK56D02HKNTHA7W03JCDD1F13X9H","success":true},"operations":[],"transaction_identifier":{"hash":"0xd0bbbb3f68bf4475ebd52d13a41cddcf233a15b808967321f3d35f54694a2d5a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x08b902ff85f8ccaf63f80c51e5a5058d790c10a734034e5babfb07a791c7e7a0","index":98222},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000097829cf5920670f357f5def5b64765d27505b1a1d07ff0574","index":2421051},"confirm_microblock_identifier":{"hash":"0xf6e2ec6edf6a8554a41fda1a90c33cf03ea4f27fd00bdda237c9a2e597edca0f","index":2},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":0,"stacks_block_hash":"0x67754b1b6d21df866423f3c938701f4554de58a893dca41057e7bf157553d1d5"},"parent_block_identifier":{"hash":"0x726a64b090d372d25298607d3d6958a469ea08a34a234654fbbd5eda6323b623","index":98221},"timestamp":1677069009,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b6a686766647361)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6b6a686766647361"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004006684c7aac54fb4eb6ce79b232102f1522560ffa000000000000000090000000000000bb80000e8882390556d506fea237d2a8e7e1024f8d8d34b851f11ca8529698579a4f3c55dd3add7b13e479fc21423248c1c4c3bc6170eef231cf7b2491701a09baaeaf0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096c6b6a686766647361","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009cd04686173680200000000086d657461646174610c00000004046e616d6502000000096c6b6a686766647361096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6684c7aac54fb4eb6ce79b232102f1522560ffa0","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K89HXARN7V9TVCWYDJ6882Y592AR7ZM0WDV711","success":true},"operations":[],"transaction_identifier":{"hash":"0xec73248fed91a5f71b8779961ed433ffe3202ad13963efece699e9fa3ac8e7c1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x12b983627efc13f52a45fdfc36b92024a84fcc557df750d3956172f2394ca56d","index":98346},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000059bd8dd9049303c8c3ce520c4540152c399886c0f4219868a1c94103","index":2421186},"confirm_microblock_identifier":{"hash":"0x31892ac3e47325ef576607f6c25acda7753577d51cb2ca0affa03ee94e8205ea","index":5},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":135,"stacks_block_hash":"0x0dce1bbe808fab0908fac77492662f678b95e95c9fe757947ea2cb46590c3cde"},"parent_block_identifier":{"hash":"0xceaf21f42a04d6e6cd2f2f5c6e144f0206b10b8ea2ce588dd906c83531025c4e","index":98345},"timestamp":1677158976,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x71776572617364667a786376)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x71776572617364667a786376"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400234be811e63690e480f7cab613abc826d0f4afa800000000000000040000000000000bb800001990e2333b11afeed29f300d8c1262a193d4f39d63124b8d88ca71b618d301aa7dc486c8637a5a56e411578e9539e6e99a8d8965a13489d28c766402180f9e51030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c71776572617364667a786376","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009d204686173680200000000086d657461646174610c00000004046e616d65020000000c71776572617364667a786376096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a234be811e63690e480f7cab613abc826d0f4afa8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHMQT0HWRV91S40YZ5BC4XBS0KD1X5FN165QNV6","success":true},"operations":[],"transaction_identifier":{"hash":"0x2a43caa3f2255a4907c8dc36ebb5aef6b049052c2af305b28834e07e63f861e0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x733cfc2667dd25b5636bbc9c6a1d281c0483092ac7cbe4f385395e9f56ecf613","index":98456},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000253ca50e50cde68f44b6a04b46b1d720aa742e352d62481f1b","index":2421301},"confirm_microblock_identifier":{"hash":"0xf0b6b6c1134371a37d84202c43bf8bab9bd782d7a48b56dfb4f7661de2be19dc","index":5},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":250,"stacks_block_hash":"0xe96494d29c999d91475af2ac6da16dcc41dcd56c9311ac5537af5af893c64258"},"parent_block_identifier":{"hash":"0x04d87818cb0e2c6400b10035f26561947690f80cc17c41c99dcead602fc3fa82","index":98455},"timestamp":1677235917,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61736b636c616276616c6f6e76)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x61736b636c616276616c6f6e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400234be811e63690e480f7cab613abc826d0f4afa800000000000000070000000000000bb800014900b5cbb775cb010966cd06b3e7082e6e20fba9f075529ec1b43212d5b7a82434fb02a45bee29e6ae90550363d77492bbea9bed97f6345838917526399075d5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d61736b636c616276616c6f6e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009d604686173680200000000086d657461646174610c00000004046e616d65020000000d61736b636c616276616c6f6e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a234be811e63690e480f7cab613abc826d0f4afa8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHMQT0HWRV91S40YZ5BC4XBS0KD1X5FN165QNV6","success":true},"operations":[],"transaction_identifier":{"hash":"0xd3b1ea15320d5ea4750cca35daafc20b54b54f89dd68305510c1a97b016bf64d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x795bee62f023990ffe8cc9d98ba57315188305a8c67a0f8a4c9ceffc2042c4a6","index":98458},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002a1594e3839f0c603d46fbe3d3ad70c210ceb8268ff220d59d","index":2421303},"confirm_microblock_identifier":{"hash":"0x62d984420fd8a57e6f45f1e15acf972cdbc62384a9c2ac2bc681aea42e47ac53","index":4},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":252,"stacks_block_hash":"0xa738f7ef9f1dde50ba442f511461a056705c7e3bd17bfbadb4a3ac3b083b96cd"},"parent_block_identifier":{"hash":"0xd88081f482a6049ad2a342ed0b73baac96d1e9b5744c2d52ad40f18f17199d35","index":98457},"timestamp":1677238097,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6e6b6a6268766763666768766a6862)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d6e6b6a6268766763666768766a6862"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400234be811e63690e480f7cab613abc826d0f4afa8000000000000000a0000000000000bb80000cf59bf28e76af7293a85b7712de821958e07a62c735350ec1ff7237eb8f9b6644bd56c35f6ac165a71150eef392d4c5708502b806c016f44ac93ae04944c0571030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000106d6e6b6a6268766763666768766a6862","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009d904686173680200000000086d657461646174610c00000004046e616d6502000000106d6e6b6a6268766763666768766a6862096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a234be811e63690e480f7cab613abc826d0f4afa8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHMQT0HWRV91S40YZ5BC4XBS0KD1X5FN165QNV6","success":true},"operations":[],"transaction_identifier":{"hash":"0xf6a91dba9cb2d54957d45e11de46d98a1cf9d63e59942d5e58edf60281ed52f9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd0d0563491e185e62d64525c4393666abb014303d20abb759dbb8ebd4e8d593a","index":98459},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002459da95deba61898126bd3aeaf96d6d1ee8cd286ad6a53860","index":2421304},"confirm_microblock_identifier":{"hash":"0x232bbb0ec673d53fcf640062e28225fc6c9132a7b7fdb339399fe64e52414187","index":5},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":253,"stacks_block_hash":"0x1c011d2ded436c65c8305c3000e88067bab00dc4fd472da6bfde30802b6f990e"},"parent_block_identifier":{"hash":"0x795bee62f023990ffe8cc9d98ba57315188305a8c67a0f8a4c9ceffc2042c4a6","index":98458},"timestamp":1677238708,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636c736b646e76736c6e646b76)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167347,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x636c736b646e76736c6e646b76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":31,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e000000000000001f0000000000000bb800002f897f4702150683a1fe853822f428415b66f35add9ea03fad51d18cd49d28ab2d9e76db8c5ad0bff0474afededb3c23259f96ce49c492843dcb4a6fd75befda030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d636c736b646e76736c6e646b76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009dc04686173680200000000086d657461646174610c00000004046e616d65020000000d636c736b646e76736c6e646b76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0x9cbcbf564c5e058b3018f4b81b9c48bfb85759b3562538971adfd67ede0e6b1e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7f6e97916c7b2c066c33ab05063fbadf5cfa014aa277b4363fa0ae3dfdce6cf2","index":98462},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000022f9cbe8ff5ad18ad8f4a885bf933202e2989ff4d6b761a7e5","index":2421307},"confirm_microblock_identifier":{"hash":"0x48726d5d74a7025736f75801f4e797f5cb72b45e907fb302aab0c1f343f32800","index":4},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":256,"stacks_block_hash":"0x90598184b94cf2fd5e418ab9b8d6d9607b1c66f235e6a52975565754a56cdfbf"},"parent_block_identifier":{"hash":"0x057237ef3a560d43eff0b2bb3fcd73f7e28ea25ac10ed71f7069b46784cbbd29","index":98461},"timestamp":1677240649,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e62686a6776666364787479)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167308,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e62686a6776666364787479"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":23,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b82835677800000000000000170000000000000bb80000a5486bfe0fca3cd69c82f3b9553e74906eb507929ff071b233fe290202fd7ceb3824a570ecdd9d5c44e50aa551a5a91e36ab64c68665f15e8dd19ac93a2b804a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6e62686a6776666364787479","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009df04686173680200000000086d657461646174610c00000004046e616d65020000000c6e62686a6776666364787479096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0xc001c1c6d1bd39d4846e3b000fcce5d12fe24c951d0ab501e790c0bdf4c220c1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x17d6f1e390a24af58044b7a43405d4bacbab1ab456031aadd98858bab180a852","index":98818},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000017f41e5ae5e69d1324ed62fd4082ee626fb24ee252da592813eb2ea","index":2421723},"confirm_microblock_identifier":{"hash":"0x074c6c0f6bf964865252a5d89063542d6b76c711af8efb7b5562e0122005fcd3","index":2},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":672,"stacks_block_hash":"0xe4840835ac28d3fa98a3ee76756ef4d27ebc6aed41c1ab7e578413e478534d5b"},"parent_block_identifier":{"hash":"0x6cbeb64088a64afd1ce170241aa696b1fc765d913c6ebab6f7cb7d7772155e90","index":98817},"timestamp":1677467737,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364766c73646e766c6b73646e76)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167386,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x7364766c73646e766c6b73646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":26,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b828356778000000000000001a0000000000000bb800009159f2ada65f80e809eb042d105fd8f7ada3cd648f8b15b948c224b8df8708ff0b08bdb15b4930177d5b4911ef3422fea9c4c2810a4f99ac5ddae25ec1250d0a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e7364766c73646e766c6b73646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009e204686173680200000000086d657461646174610c00000004046e616d65020000000e7364766c73646e766c6b73646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x689ac8c95e9529aa15335874d2af22bf77ec4a419e38f729d52738a63741d9e4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0c20d6626905fec1e9541d52568e343fac2a45b66ca578862abbc0a9ed4ead71","index":98827},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000215e5d2abccd229fc6f49b4fdc5568c07f89d7bde033814ed","index":2421733},"confirm_microblock_identifier":{"hash":"0x0849670dee273db32d14fd91c7631be4c989548e24d2133a984531ad53a901a8","index":1},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":682,"stacks_block_hash":"0x27c491fa92a159ce41460a54df9faf5ebbf4f4c47ad8d651bfd624147142e264"},"parent_block_identifier":{"hash":"0x803959483d56943ba945de8b068ffdbf27d0d01d0799afd50b99c90a528bb501","index":98826},"timestamp":1677473133,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x33316e6a616b736662)","execution_cost":{"read_count":16,"read_length":44007,"runtime":167191,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x33316e6a616b736662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a000000000000000a0000000000000bb800010193481a34cad0cc1472d8b2a947c23ef44f4645c6b07d8e219b2a20f3f7bce66eca436e937a3f69675ac0ddaf3bce29d44748872c74c1f2d797be488c101b93030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000933316e6a616b736662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009e404686173680200000000086d657461646174610c00000004046e616d65020000000933316e6a616b736662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0xa99203b4452472ca915e673d107a19bacb23201be49fc95376c43efccdd440a0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x51cf3f804720b5657c012e3a2073a1bb1a02be8b42a7af9b5debb312ef1dc3d5","index":98992},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000207b729f659cdee6d0c6910abeae10d123f12efc5061d50864be281","index":2421949},"confirm_microblock_identifier":{"hash":"0x705831bd44579b09c3e4d5e512e9acc37ec7bf8d3a9402cbbc41aa23a8e1f77c","index":4},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":898,"stacks_block_hash":"0x684cb592f567e6c44400cb8a126960ac69c92520b2c50589c89414ca7331e563"},"parent_block_identifier":{"hash":"0xa653626dda03ed5806aa11651a5797f103c9b63626456c1bf1509c67f4bc34bb","index":98991},"timestamp":1677566688,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6876676a6867)","execution_cost":{"read_count":16,"read_length":44001,"runtime":167113,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x6a6876676a6867"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006eae96ccc5f772aea645fd31ec4101cddcb08822000000000000000c0000000000000dac0001d2babfeabffaecbeedd5f291831c1981787ffad541c1e2791ee58d28bbbaed96710177a3e32ecf8872c97b4c333f6a017960b17b2a6ca06db89ba8965a8bc793030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076a6876676a6867","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009f004686173680200000000086d657461646174610c00000004046e616d6502000000076a6876676a6867096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6eae96ccc5f772aea645fd31ec4101cddcb08822","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1QAX5PCRQVQ5BN68QYK3V21076XSC484AA9ME7P","success":true},"operations":[],"transaction_identifier":{"hash":"0x4f1921f5ae5dceddf077428d4bf5a46f2eddd2e53e5dbf0ed42ccac23ceddb53"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a6268766763667863666867766a62)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167464,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6a6268766763667863666867766a62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":37,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400b9de3832789df896a8f95f34a42ab103bdd5b27e00000000000000250000000000000bb8000023420c2e760e9141de2921e20638695740187367a7a0f044757d4876945bb37c04c103289237c2cdcf8bd9c34ed0e0b48b09c296b88827fa3660381f1cec8119030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000106b6a6268766763667863666867766a62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009f104686173680200000000086d657461646174610c00000004046e616d6502000000106b6a6268766763667863666867766a62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab9de3832789df896a8f95f34a42ab103bdd5b27e","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2WXWE1JF2EZH5N8Z5FK991AP41VVNDJFRM9P9KM","success":true},"operations":[],"transaction_identifier":{"hash":"0xb527312041093946ec7f66ec9ea12982d6d237fa7af448275c45e2f04190d48d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x85fe15fbc0a9166844aa4b0808bd1794e76ca2cb4c3597ee3aa683a075b88e64","index":99009},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000019694f1effff7a142d391d77e827d6ac68682510c680e017193b0df","index":2421968},"confirm_microblock_identifier":{"hash":"0xc71d4cdbc9a2a2137a5d2a8759aaa6f944f9c17be4762264bcb85a89529055a3","index":2},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":917,"stacks_block_hash":"0x31f2543f2cd1897ae0fe8de5040d0665a80428fef8a12710ec00450e6d035b7f"},"parent_block_identifier":{"hash":"0x5012d2f0f864ba3052e6b13a84f2abfda146ea93ee44986495eb9ebc0967d1be","index":99008},"timestamp":1677575152,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265747279746573743232)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x7265747279746573743232"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004003f67a76b82c8d4fd09755f64589142b2f0ad7f6900000000000000070000000000000dac000185957a911ccf35f241e0bd145e9b48a15c242e4ac1335e1bb92355724e7fd1bb2704aae4f1f98c4ed94f4addacef7f58b5e6d9f1dcee490ac1ae01f248d1317e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7265747279746573743232","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009f304686173680200000000086d657461646174610c00000004046e616d65020000000b7265747279746573743232096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3f67a76b82c8d4fd09755f64589142b2f0ad7f69","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STZPF9VBGB4D9Z89ENFP8P4H8ASF1BBZD67DASG2","success":true},"operations":[],"transaction_identifier":{"hash":"0x044b9e3944023223da0f64f38e727910e37d512d902e7eab54c0f21efda6700e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xca6783694802bc08731ee7e9d27e07be02d9ecbbe2b9375ffbb32ef71da9eb78","index":99050},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000091835f5ae294119e73cf4eb326e3402ad06ca1d5105ad8bfb468f34c","index":2422014},"confirm_microblock_identifier":{"hash":"0x64266688ae3641c4654b4e2e8b15685f56036e45d0a8cee07367303c2eed3eef","index":2},"pox_cycle_index":401,"pox_cycle_length":1050,"pox_cycle_position":963,"stacks_block_hash":"0xa5885b7f40e09c12feb54c79dc299f8cafa0138f626c5db8c32b9c41e80fc9ed"},"parent_block_identifier":{"hash":"0x06cf9577c10644a97e862d8775ba764b660eb31be4c1d6557902b55b1ca3cd4a","index":99049},"timestamp":1677595437,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6572726f6f7272722d3930)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167269,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x6572726f6f7272722d3930"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004005288e06efa46255031be51eb3aaf87d893fa883000000000000000020000000000000bb80000d7d4890f43acdc9b49635f51e48ae08e6a8d02ad3130d06e84b5b60488ed3e830dc10df3ce15930554112f03eb4923b7d910f17deef1ac7fae9b7384b147513b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6572726f6f7272722d3930","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e64657801000000000000000000000000000009fd04686173680200000000086d657461646174610c00000004046e616d65020000000b6572726f6f7272722d3930096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5288e06efa46255031be51eb3aaf87d893fa8830","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST198HR3EZ932AM1HQS8YPENFGZC97YM8603JD88X","success":true},"operations":[],"transaction_identifier":{"hash":"0x9a456401a6ebfa7df557d50e2f8b0c4111c8232f070dc2aeea2f7af851605ad1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x11a4b27d4c38431759a0949124a29feef3154c819da87b364b4388c84dbff617","index":99122},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002d7288b315f54ec44a2527dbc41fc0cfff4279e299565eba96","index":2422154},"confirm_microblock_identifier":null,"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":53,"stacks_block_hash":"0x1d09701b2d47b0807dc3e941fe9faa4a7399b903af3d81327cd4fd5205b27d7d"},"parent_block_identifier":{"hash":"0x7215cf49608b3ff9ab0946c993117470c950720791ec36909561731ba4328ffe","index":99121},"timestamp":1677681066,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374646f6d31)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":71200,"kind":{"data":{"args":["0x627463","0x74657374646f6d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":11},"proof":null,"raw_tx":"0x80800000000400a13d9a0b46eaf8ba12c036b9ed46e6783a72107a00000000000000100000000000011620000009cd5de3830f988465066329255d50846b6ea5bddc123717e0a0ba1340386d483f5848484e9d02d670c100e6000c49e11fed16fde72062af2f2e1606d5f89985010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000874657374646f6d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a0604686173680200000000086d657461646174610c00000004046e616d65020000000874657374646f6d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa13d9a0b46eaf8ba12c036b9ed46e6783a72107a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2GKV6GB8VNFHEGJR0VBKVA6WSW3MWGGFBGQGZES","success":true},"operations":[],"transaction_identifier":{"hash":"0x6555cd008c555aa78636872dc0738646fdf32172f4427d09d1d22b68e9cf3393"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a786376626e6d)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":70800,"kind":{"data":{"args":["0x627463","0x7a786376626e6d"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":12},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b51000000000000000f000000000001149000000b8882af530a2d7591ffed9328536fdc4ac4b4f2782ea6853c3632856b68da665612bbbd40b51d32e329dfe53fbe356a783730fe3eb3bcda663928785a766390010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000077a786376626e6d","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a0704686173680200000000086d657461646174610c00000004046e616d6502000000077a786376626e6d096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0x3298355dc9d43b5457c23d91429e856be4311988c82352809329f0f6a14ad776"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4215531d357b7b0f4f26edc3346b6da57089142a59858600b758e54dac0c5525","index":99123},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000e485afdafb8e88b352f9771c4c3f78d43c8eda047cd2fa505a866ba1","index":2422155},"confirm_microblock_identifier":{"hash":"0x7b45f06aaa7fc2823683803e095b64169b890a0ecd1670220fde270ae5b059d5","index":4},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":54,"stacks_block_hash":"0xc0a6e0039e43b3050dda98d3e272e090854cf1e98a6080bc814a342fb2a9b042"},"parent_block_identifier":{"hash":"0x11a4b27d4c38431759a0949124a29feef3154c819da87b364b4388c84dbff617","index":99122},"timestamp":1677681677,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6172666761676466736667)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x6172666761676466736667"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400909b3b63ac083b69d76f08df2a013f299a36599500000000000000040000000000000dac0000a099b7feb66fc8fce1b336b4729b28c8302c0bede2535f6ae39a95539db5fc1a1e4dae1fbaca885b5b8784e0ec830a2bf7c26435cc27a477fdcf044fc0015ecf030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6172666761676466736667","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a0904686173680200000000086d657461646174610c00000004046e616d65020000000b6172666761676466736667096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a909b3b63ac083b69d76f08df2a013f299a365995","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST289PEV3NG43PTEQDW4DYAG17WMSMDJSJQ8P2KND","success":true},"operations":[],"transaction_identifier":{"hash":"0x1ba960d3a767448ee6c784369947e95947238a8697e7a52e56b9a6bd8f2c2124"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7365667766)","execution_cost":{"read_count":16,"read_length":43995,"runtime":166750,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x7365667766"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004003535178d22e32b633587174d97ed4fa21642c4a200000000000000070000000000000bb80001e7526c70f6ec79d5151ac17923ae40fc10419626be3a8841ba1daabbdefe4d3b5fe73bb7070ddb4ae4071b78778c22036f945acc98180cbd15a383fb9cffce7a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057365667766","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a0a04686173680200000000086d657461646174610c00000004046e616d6502000000057365667766096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3535178d22e32b633587174d97ed4fa21642c4a2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STTKA5WD4BHJPRSNGWBMV5ZD9YH1CGP4M9PRAVVX","success":true},"operations":[],"transaction_identifier":{"hash":"0x18cc84021971787d4656a4cc42837c4d8f275af0640025ee8953b249ae3d80d6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xbcf4767f880da00ca56187a79df010c5c8afad9bb74536956f3a197401393805","index":99245},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a42c50ca94bd0471917870b85b0acbe22ad17ad3adf4fce5a","index":2422326},"confirm_microblock_identifier":{"hash":"0xb7b950c7d6841b1272ab28451a21b1848bd1ef1f554f501e9610e7794421969e","index":2},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":225,"stacks_block_hash":"0xacf0f04d237b93de3f52f2db740b5e00aad2982c7c5a49fb9653ca232810e1f2"},"parent_block_identifier":{"hash":"0x0602268fed345be93b008ef2475cec59f886b86af89d8e8f2f12e8c3c9f41577","index":99244},"timestamp":1677748935,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61736b6c666e616c6b7366)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x61736b6c666e616c6b7366"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":22,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b5100000000000000160000000000000bb80001ba11fad4a21041f97505708c9aba9fc8c1fce0c9133020896421a061e97976f73d02173412134efb6487ac0cbe777edb75da7da8a386af3c9958666261f9a24d010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b61736b6c666e616c6b7366","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a1c04686173680200000000086d657461646174610c00000004046e616d65020000000b61736b6c666e616c6b7366096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0xf050a0fc0d378f9344617ad82c0e136641c1217a74b943328270fd9b4de403ee"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x511178284926a9b20e56f832130d69b3084b76cb7bb28bb5f4910f69b7ed638f","index":99260},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002fb7080873589b5bd15a1d19004d3ab3094616f206583cb1ba","index":2422357},"confirm_microblock_identifier":{"hash":"0x080370e8d24a39572ef98b6de934898177c721caae18b3cfb372d0fc003500f9","index":4},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":256,"stacks_block_hash":"0x7a7f6b6f01b491a006ea88112148ff9b0a949bc7910fec7fd3ea1d11f2484769"},"parent_block_identifier":{"hash":"0xdecb9cef44f0c2c44f23a99976b3c11650b93de28a13bf6f8cb7c0bf05bd3c77","index":99259},"timestamp":1677757252,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73696668736b6a64666261736b6a)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":12000,"kind":{"data":{"args":["0x627463","0x73696668736b6a64666261736b6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":25,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b5100000000000000190000000000002ee0000090877f3f3cb9e641ec4eed205fc04f027a01802834fcaf1d65486e3021a2b8f24f42dbf16cf6110761768264938eb9a8b09f2bd7ed6d8ab373cd73e71a9978a5010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e73696668736b6a64666261736b6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a1e04686173680200000000086d657461646174610c00000004046e616d65020000000e73696668736b6a64666261736b6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0xbc0149622c9a5d506c5d9524681817320107f0bbf6d032de7aa630b3f4ffbaec"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x75f371bf5447392aa22ed6c4a775a798c367a12a9897dafc9f2eb892d8e1d0db","index":99342},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024c0fdbdbe2f3a23b7513b137cb84966e404733ff8a0f25cdf","index":2422586},"confirm_microblock_identifier":{"hash":"0x7ce0b67b98c95be8c29f65b8fd3efdc0e5a4d405df69f6b379e3ff054990a28a","index":15},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":485,"stacks_block_hash":"0x53debea94ddec69e7234302798d1e8f9864b423e13a3afb034392d6ed3b6b665"},"parent_block_identifier":{"hash":"0xa05fe34d3bb2daf0f4343b046feb89913a243325e081d84365e7b18ca2971362","index":99341},"timestamp":1677828657,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6867766a66)","execution_cost":{"read_count":16,"read_length":43995,"runtime":166750,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6867766a66"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004003535178d22e32b633587174d97ed4fa21642c4a2000000000000000a0000000000000bb8000050cf05a0363690a50c9b935d6cfd76ec187c1d0a2c4bdd21907b6a2619a833c15523ff50c553e94dfc851b62efb455e098cfa5afe71c2faab143b29c6cce885e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056867766a66","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a3304686173680200000000086d657461646174610c00000004046e616d6502000000056867766a66096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3535178d22e32b633587174d97ed4fa21642c4a2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STTKA5WD4BHJPRSNGWBMV5ZD9YH1CGP4M9PRAVVX","success":true},"operations":[],"transaction_identifier":{"hash":"0xac5620ef01ddad09463d82eb9dfb962d398feff63f4c5dcdb9c9d37d50f7637a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x69dc6bbc219df5f49406e76539b27185a4b22aadb8998cde6bb557a2f04fa21f","index":99351},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001fcc45d41853c82422524e73899a395d75c29ce86a22270338","index":2422607},"confirm_microblock_identifier":{"hash":"0x6c971107eb34a635e1c97533e071e0e7449d8d46fc481f5ae478c709fa5ae2e1","index":14},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":506,"stacks_block_hash":"0x38b1477fac0edd3bfee1792ff12683c56a148b4b3ab8acdbdd73a09b9b0b1708"},"parent_block_identifier":{"hash":"0xfc117ab882aeecaa28e0e33cb0d1a383f14fb710b638e4208cbfd52629d0c680","index":99350},"timestamp":1677842673,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66696162696c61)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x66696162696c61"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400a05751fddab7e6fca2a007e66c293c601ae75be000000000000000010000000000000bb8000005d25562ece1c0660d7f94a2d2e6db56d5cf9b450e36dd315b220a1003a4a95d73db4ef44fe1ec415049aeccbacae40a400135a22b7e73a715f427f79a28c288010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000766696162696c61","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a3c04686173680200000000086d657461646174610c00000004046e616d65020000000766696162696c61096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa05751fddab7e6fca2a007e66c293c601ae75be0","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2G5EMFXVAVYDZ52M03YCV197HG1NSTVW2DZA51D","success":true},"operations":[],"transaction_identifier":{"hash":"0xaf60c46bdf7ff4ace7c987b3178416221aba2dec3391e0740e4a7f29e4e58bf3"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x686d6a676b383738)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3500,"kind":{"data":{"args":["0x627463","0x686d6a676b383738"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":24},"proof":null,"raw_tx":"0x808000000004003535178d22e32b633587174d97ed4fa21642c4a2000000000000000f0000000000000dac0001eeacf387326c4cd88979a2b27f490f649840658a85e847917b98e293ac595652527dee23fa87b334634c32165f2f4611daa0227d2a79c33b94fcde2db2dee8a4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008686d6a676b383738","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a3904686173680200000000086d657461646174610c00000004046e616d650200000008686d6a676b383738096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3535178d22e32b633587174d97ed4fa21642c4a2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STTKA5WD4BHJPRSNGWBMV5ZD9YH1CGP4M9PRAVVX","success":true},"operations":[],"transaction_identifier":{"hash":"0xbcb6ffc13975a28e00b3c4321edf04db5aef1fcaabc2b0eea4ae88ce8f646af3"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5aaedb185e06e6711cc3665361ab18c9d930a7d7b022a4ef9790cde186f051f1","index":99355},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001f69031976cdd95a059d265792b62239177ca0213a4130456d","index":2422621},"confirm_microblock_identifier":{"hash":"0x077996c937a2ae208db1da9432c51c1bec20fb55ab1882995141b554d38a98fd","index":16},"pox_cycle_index":402,"pox_cycle_length":1050,"pox_cycle_position":520,"stacks_block_hash":"0xaf65f177a2def033e5deb9d961bb095e3ad69ae4f8f972a2475f295bef48b45e"},"parent_block_identifier":{"hash":"0xc15597385f2c9883ca064c8ad2426e70bef376da449e1e7104675180441e2402","index":99354},"timestamp":1677847309,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x707169776e766b6c646e76)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x707169776e766b6c646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":7},"proof":null,"raw_tx":"0x808000000004005d35a7e8d4600d0285ec0b3a97f764c750e415d400000000000000100000000000000bb80001b8a6f16fe3a349aedb73ef1cb3061ac1a773d5db35585568cc4057e228cf9b1972abdb932b5787ca5bd69ac822e285a8753c1b9d14436cfd36cc20c92f90bad5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b707169776e766b6c646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a4204686173680200000000086d657461646174610c00000004046e616d65020000000b707169776e766b6c646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d35a7e8d4600d0285ec0b3a97f764c750e415d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKB9Z8THG0T0M5XG5KN5ZQCK3N1S0NTJ3R9R4W","success":true},"operations":[],"transaction_identifier":{"hash":"0x9e38ef6e57bec36730c6b138c361949b24bf66879ee34a62020c3c0a777e2800"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0c1aa4483662a741b244ea6f29c36493e2bea42e2c24452fc4c378db6ef81f67","index":99643},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000c0c71894310d59013b31867b3904cfcfe5457ca845ffafd34c0283a","index":2423206},"confirm_microblock_identifier":{"hash":"0xab914b47947c5ea0afbb409d3f4e9ca04a624673985d9d9186cbd09617553485","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":55,"stacks_block_hash":"0x6db2b6c82ff7c126db21819854c6837a77afc271ff460acb4ff93bc0a126c803"},"parent_block_identifier":{"hash":"0xf4ab83f0495f1c58c3658730c120393d360976714aa4f7bab146de017298faed","index":99642},"timestamp":1678142404,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6372617a7979797979797979)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6372617a7979797979797979"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040099d6b63368b4064cf7f41e40e4102848cdf0204b00000000000000040000000000000bb80001638a4cab5f3b1dde24753b828c007d53e1a6824a9816a1069902943ba11471a76e5349afdaec2955b7874402a90174fabd04f37f91879df496a306f147680f07030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6372617a7979797979797979","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5104686173680200000000086d657461646174610c00000004046e616d65020000000c6372617a7979797979797979096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a99d6b63368b4064cf7f41e40e4102848cdf0204b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2CXDDHKD2T0CK7QYGF41S0G514CVW109E299EDG","success":true},"operations":[],"transaction_identifier":{"hash":"0xd6eb2bc0edf27b0210f404f35ccce6f027421f2da64e9917aec6bc035d693a09"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2ddfd4c1583fb2584b6ef94b905bc6d9a8b70ca38a621870820ca1393466b4f4","index":99674},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000005eb534dbf686ea758d0f1bfb4bdf93e85c6eda5335ec4947a","index":2423250},"confirm_microblock_identifier":{"hash":"0x9ae42e0a20328e2b7c374788c6a24afbdac4b64b451a996d452f5db35a04fdda","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":99,"stacks_block_hash":"0x2c86bbf42bb90e64e90db399c50d16bde1aaeddcc8c06d49021e7f0b4dde51a9"},"parent_block_identifier":{"hash":"0x6521817528e74bdeefbe58080e6c414ea36f14004bd471082099fe5001be3de3","index":99673},"timestamp":1678170882,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d31)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b40025714a64d3e84a98768e0e34a716eedaffce00000000000000010000000000000bb80000305f9c9da8ba96680dae7f1c14f763249f3c0e03af872fcf762f4bcd048d38466e8e414d6f06ad52d0f3d423dba16fee30dd3a5be1d51ff2a526eb9e6100743b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086d616e6167652d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5304686173680200000000086d657461646174610c00000004046e616d6502000000086d616e6167652d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab40025714a64d3e84a98768e0e34a716eedaffce","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2T009BH99JD7T2AK1V8W3HMMWBEXPQZSV808DH9","success":true},"operations":[],"transaction_identifier":{"hash":"0xfd9b2716ade692c82c5b101c2561f234f2129347ea3ab50866f74f4fdea13dda"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2d981f72cd0c50bb29c7a177de9d0f4c5981092a18ee1213ae060ec21a741c74","index":99676},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000bc91e7f37b3365433fc58b4ce604f9ac60aba3f4cfb0dc686","index":2423252},"confirm_microblock_identifier":{"hash":"0xfc1267434a999f0dabfbc125f784e611767b1a6d61a082744fd302e02a903d6b","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":101,"stacks_block_hash":"0xb91c6e5c9ac308eca34c7889579fa74c58d3aa80011ef33da7011f9919b38c10"},"parent_block_identifier":{"hash":"0xe7e348eac453219325a62b1bc328adc50084bc9ae93dd9ae6ad5f5d3c32cb220","index":99675},"timestamp":1678171648,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d2d70616765)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d2d70616765"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b40025714a64d3e84a98768e0e34a716eedaffce00000000000000030000000000000bb80000cf2ee87c4158fd3bc9962206b3679073e8c68fbf1bbf234dff8a7bb4696de9685abafff97bc57b14e6d2984eb6b3e0c6e016036d027e5646d747fdeef5481006030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6d616e6167652d2d70616765","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5504686173680200000000086d657461646174610c00000004046e616d65020000000c6d616e6167652d2d70616765096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab40025714a64d3e84a98768e0e34a716eedaffce","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2T009BH99JD7T2AK1V8W3HMMWBEXPQZSV808DH9","success":true},"operations":[],"transaction_identifier":{"hash":"0x681600e7c4d318edb009bf66983c2ba05d0f4b9bfbb72c7ad031a43d1948fc05"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x34522707320d8526e23654e93f3f98e1dbe7798139ab1c45e65aa9d1fb268e56","index":99680},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000003a0a77c981f0102db2d9d54d766af0149282a27670118fafd9e","index":2423256},"confirm_microblock_identifier":{"hash":"0xfac18c1639fcee944f838b67b00fbb0377b26584800127500182412e3edc4b8a","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":105,"stacks_block_hash":"0x217544798d5cbd7f137b3a59fd2e053d2d403a8b7a573ab774f66741f99c3c4e"},"parent_block_identifier":{"hash":"0x6424f8031ad029e6daba4c23a8cc5e4dda4d7425894027e4b1802434efe53a38","index":99679},"timestamp":1678175035,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d2d706167652d31)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d2d706167652d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400b40025714a64d3e84a98768e0e34a716eedaffce00000000000000050000000000000bb80000e3a3c48c14139355d0c9832971b08a541e04d0984b134c3294ca4be83adc30a4252f2f78fdf26660e70a1fa408cc9167d631b6bf68086dded4ee2ff5af641d44030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6d616e6167652d2d706167652d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5704686173680200000000086d657461646174610c00000004046e616d65020000000e6d616e6167652d2d706167652d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab40025714a64d3e84a98768e0e34a716eedaffce","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2T009BH99JD7T2AK1V8W3HMMWBEXPQZSV808DH9","success":true},"operations":[],"transaction_identifier":{"hash":"0xee68b1c77ceeb98f91e300a18c6c9d4b570274212392b0095917722dd2b94f76"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3e3b4a43bed41a24b98891994069fad9ec0d704ab44ff168217e53c7260aec78","index":99692},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000014eddb5c9f3cb71833f278988c1808f19fbd99526f2b826fe75e","index":2423268},"confirm_microblock_identifier":{"hash":"0xf1b50f6c6672ececbcb008ccf6c4db207133ea9f46d82f2a3687829fec98f1c1","index":4},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":117,"stacks_block_hash":"0xdc3b4c760694372f698e7faa6626512eaa52c9cea8464e9a35b56afc39dfe448"},"parent_block_identifier":{"hash":"0xd3eb05568b2e7d51786ff7305767d74668d249b27b512b741021340035d643b9","index":99691},"timestamp":1678186157,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d706167652d323232)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d706167652d323232"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400aebc06a71f77718e7bd3196f75e11cb223889e0b00000000000000010000000000000bb80000707f19035812c27fd5885d985825f4bdfb151c14ac54f87379e58d61a731ce313a1a537ec5e26f1ace9e3d0deee8d6f4fa78712c999a5c721cbd6cdb393c1033030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6d616e6167652d706167652d323232","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5b04686173680200000000086d657461646174610c00000004046e616d65020000000f6d616e6167652d706167652d323232096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaebc06a71f77718e7bd3196f75e11cb223889e0b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QBR1N73XVQ33KVTCCPYXF13JS2724Y1C408TTC","success":true},"operations":[],"transaction_identifier":{"hash":"0x01a93b837202d778f14920fb68bbb1993e2b2e3422989a36324e33f145028b92"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb02c2bf1a3636a407c5a1ebdee0e7b86dfc229b80e80b248a161c22d66bd5634","index":99697},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000009add397bb456f6733b8c13ccfa88f4f86543a324be7664afe","index":2423273},"confirm_microblock_identifier":{"hash":"0xed04a62f814dae46ecce94943a9e68d8d0c46ae22e0d2e2224febdcf0c6b8aec","index":0},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":122,"stacks_block_hash":"0xfce5468364f5c24d852688a5ab3898c5496180d2f4d56dc2b67baf95192b061a"},"parent_block_identifier":{"hash":"0x87445ef7ea2f20ceb40c1b28e12bead48d2ef5421031d1c2a25fad1171d3bd8a","index":99696},"timestamp":1678190321,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d706167652d32323232)","execution_cost":{"read_count":16,"read_length":44028,"runtime":167311,"write_count":2,"write_length":167},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d706167652d32323232"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400aebc06a71f77718e7bd3196f75e11cb223889e0b00000000000000040000000000000bb80001906291b105297f31efe2292c2b14ee4c2137d124242c5ce974cf24fa5d0216f177aec8b4c43813c8c0098824d58e4499a08182d260da397d31e68bec4482814d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000106d616e6167652d706167652d32323232","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a5e04686173680200000000086d657461646174610c00000004046e616d6502000000106d616e6167652d706167652d32323232096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaebc06a71f77718e7bd3196f75e11cb223889e0b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QBR1N73XVQ33KVTCCPYXF13JS2724Y1C408TTC","success":true},"operations":[],"transaction_identifier":{"hash":"0xdc65ab1b3cfaab7f213359b33b6f9d53e8c12e46c38ae628b6aa9c8058616a42"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5477d15508ea1a2d0c3d8b9d2b6f28a4a71b7751e4c9150348162a2572a3c59b","index":99702},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000571ff5925fe9ccc2c4fffe3be9d94e6600a081c7207c50c42f237dfd","index":2423278},"confirm_microblock_identifier":{"hash":"0xbaf9a0e20893d6e3a826dc71dce4100a1371b23cf8e7e8e04d815ec55856c862","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":127,"stacks_block_hash":"0xb3c68c8f0358c3104738e1095dfbebcf2f56b1aa6f200009b8fff7c112d8a94e"},"parent_block_identifier":{"hash":"0x0c00afa8219c52877d0b7d20ed2a28e1ab631346fe6219d365a312e2201875ba","index":99701},"timestamp":1678193670,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66616b686172)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x66616b686172"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400aebc06a71f77718e7bd3196f75e11cb223889e0b00000000000000060000000000000bb800001b07a6354bdd826cddfd217e5e8b286bd5e162a2980bf173eedb591a8361f6e34b5e2b3cc61eae43097103cebaeca2632a20c9cad8c211b0a15d167833d442db030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000666616b686172","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6004686173680200000000086d657461646174610c00000004046e616d65020000000666616b686172096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aaebc06a71f77718e7bd3196f75e11cb223889e0b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2QBR1N73XVQ33KVTCCPYXF13JS2724Y1C408TTC","success":true},"operations":[],"transaction_identifier":{"hash":"0x0648c430916af567cbc14d62a07594bfc6bb4588999d1248fee289be0a30640d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5eb4a14cd5cf4b769bdcd73daca246807bedaae1e661ea8ad1eefd06f92c82ab","index":99704},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000441c12b1b41acd1b445f0e5342f972a3dc7aa6a550e5ca172","index":2423280},"confirm_microblock_identifier":{"hash":"0x0952818aa2a55ef10e6d5734f0fc8be5f8255506462869d3b85275dea7a1be75","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":129,"stacks_block_hash":"0x70f6d99a7f1b63a5e6ba334b90f6fe1cfbc1cc83015cf731ed804f6cd51626ec"},"parent_block_identifier":{"hash":"0x7292104f4a4e6183a2ddf535adcc0032c4a276b89d4ec85caa69bd20fcb61c30","index":99703},"timestamp":1678196081,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d2d706167652d32)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d2d706167652d32"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004006e32e39d293009c471010cd9dada98ecaed4000d00000000000000030000000000000bb80000c9b5fe2f6e61dc7fe95c58b0462be9d90c7f3b8093449bb8361c25b0922028d763f4259e9e7659d1e3e1c8db5d5a5ad0b7eaea49d14e1fac4d974532e40e0c85030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6d616e6167652d2d706167652d32","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6204686173680200000000086d657461646174610c00000004046e616d65020000000e6d616e6167652d2d706167652d32096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6e32e39d293009c471010cd9dada98ecaed4000d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1Q35RWX54R0KH3H046DKPPTK3PAXN001QENC5FS","success":true},"operations":[],"transaction_identifier":{"hash":"0xf64c3a991009119142dc8719f7da81e5c18a66caf890dc91f75ad2f9621dd658"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb2e653457af45d79b131f0d50bf11569b1e70393650a298aa4d525c59d621c1b","index":99706},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000279427d7e63fd11ecd59fba87cbf99a98a17ade6b06bdf2806","index":2423282},"confirm_microblock_identifier":{"hash":"0x79177542808e927f283ab8affe11f4cf5b3117cdf8ea5d23029a3478782e7583","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":131,"stacks_block_hash":"0x5025033d978ae4b0ced28cbfffcd3d740902008f63bf3febe7ef5c85415c3c9b"},"parent_block_identifier":{"hash":"0x5a38b20ede71261f211ac7b25707aa7e74834e43baf98fa0860e9f44642f0a2f","index":99705},"timestamp":1678197936,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66696e616c64656d6f7632)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x66696e616c64656d6f7632"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004003d3c45b9868e8fe5d51a5ac946c37d851219139400000000000000000000000000000bb800003d41dbb147ad70819e5ad38f9b768310f8f0d22d7505fab2be7b37606cb065942740b7b1c78f96fb90e425e221668f0aa83b41a0e1889fa65858d92276fe10c3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b66696e616c64656d6f7632","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6304686173680200000000086d657461646174610c00000004046e616d65020000000b66696e616c64656d6f7632096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a3d3c45b9868e8fe5d51a5ac946c37d8512191394","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STYKRHDSGT78ZSEN39DCJHP3FP2H468KJHBXTR1W","success":true},"operations":[],"transaction_identifier":{"hash":"0xce585afb72be4e3c8da255d25a716949c9b54fe5ce8cf79807fa64214d9e3404"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x373c5c642058859b365b5d80a2ea791f0d3b26f4d5e4d2d85e342d208fea5b5b","index":99767},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000244fed3cb8e6ea9f1b55fdeec307c5930ad959ec55e36387b0","index":2423375},"confirm_microblock_identifier":{"hash":"0x389dc030dea60c977e5c1262a8fbf072a3de0b974c3bdfbfd9b8cfe3a0b67862","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":224,"stacks_block_hash":"0xb105b07406f0278ee0eb7d4f7a9c0f8d297941e20dd9ee5053e03e7e1bc9ee06"},"parent_block_identifier":{"hash":"0x593b1059876c2a51bea270cba3854f16e318e668d842ed1fe64235500ba547c9","index":99766},"timestamp":1678256624,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646166617373)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x73646166617373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006eae96ccc5f772aea645fd31ec4101cddcb0882200000000000000140000000000000dac0001c9c98586b42634965448aa3d824d21fd545033eef2211f092ce1f1a6014a08eb762429c275c92ab0a38c033498a5ff15711564e7c4b8e5066a3f919826cffe18030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773646166617373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6604686173680200000000086d657461646174610c00000004046e616d65020000000773646166617373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6eae96ccc5f772aea645fd31ec4101cddcb08822","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1QAX5PCRQVQ5BN68QYK3V21076XSC484AA9ME7P","success":true},"operations":[],"transaction_identifier":{"hash":"0x024f34e1caac870f58404c4183682c249a3353b4bf48378b171264d17dcc25b0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa4356f54e47534aebbc18ddd14a485a667b74a5b66ac15a6c520ee758da7c896","index":99774},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000007ba0091a37f59366443f11ddef250385362ce2fe96f9bf81331a550d","index":2423382},"confirm_microblock_identifier":{"hash":"0x66fd984da9dc43f774473413d658a72fc85df39be25dcdf8f532be47d42a143d","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":231,"stacks_block_hash":"0x0d72dfc7c2c089b3c05c0ee76bb24bd24eea28d2468ad3b562cb3b1b2ea7c71d"},"parent_block_identifier":{"hash":"0x3d32978f6aa9ba0038110935d70e02caafb3e3fef93bf6d7919f9cfc878ca667","index":99773},"timestamp":1678261124,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x647673647661736476)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x647673647661736476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":46,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004004797b468fa8a216a901c8200c5800d3bfcf5a4d4000000000000002e0000000000000bb80001802274eff4db6e0bc6947a3189a7ab5eff4967bf8ff804c037ba85971c34d29158302b25c40b47c917fc427071f578493ce6b9267f8e96c42f5a6e3b72e45f78030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009647673647661736476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6904686173680200000000086d657461646174610c00000004046e616d650200000009647673647661736476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4797b468fa8a216a901c8200c5800d3bfcf5a4d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST13SFD38ZA522TMG3J101HC01MXZSXD4THEW0HF3","success":true},"operations":[],"transaction_identifier":{"hash":"0x1e60e5e76aea317f848bdb82a7ceaa06dcf4171ce9ce3bfa1430c249f99a46a8"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7a38b028ee35659f1d784ce6d672ed4ed55e6dc2c3d70cfb9b2e7c414b3e20fa","index":99776},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002189df4ec60c012d4334a8ba9b2f63f403efb570c95b857ed3","index":2423385},"confirm_microblock_identifier":{"hash":"0x1459b56dccce6fb56a24dd02978b0693fca031c870779fc7d3c0f1964cd6020f","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":234,"stacks_block_hash":"0xdb66f6ac9701712d27a2b74d5549fc55a7fad200eaeea7c57b02f668e2b01522"},"parent_block_identifier":{"hash":"0xcd35b969e6656bb0e3dcb9741bffd84cfba0388ba053bd8e06aab3e7d51c81f1","index":99775},"timestamp":1678262523,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6577646f6d74657374)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6577646f6d74657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":28,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400182d6d4255f279581bb31b28d0c184e300a46b51000000000000001c0000000000000bb80001ecc2c634bcf14de53223f6267689f26ad6ff3813d0b2d9da155c4a50a9e040b03f329d3258f545b74361c03dcec615552ee7ebdf2d02440fabbb16af293784bc030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a6e6577646f6d74657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a6b04686173680200000000086d657461646174610c00000004046e616d65020000000a6e6577646f6d74657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a182d6d4255f279581bb31b28d0c184e300a46b51","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STC2TVA2AQS7JP0VPCDJHM61GKHG193BA5VMDWTR","success":true},"operations":[],"transaction_identifier":{"hash":"0xf29dce903884c580f199ba4d2541ab0a7d7844bb087546d640df9431243f91f1"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x11300652ddca2d8e79fc5a200fd497adda35ae2f884c204518f39a141373fad0","index":99786},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000206311083204750da29f5a4888e830eb8137a62defd706db03","index":2423395},"confirm_microblock_identifier":{"hash":"0xa254f7c1c124e2410c40e4f9cac5ec3b44ec9df24340dd60613014967fbc5324","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":244,"stacks_block_hash":"0x9c652764c1be825264a7b3547eab14f135da39fe2998a286f22021f0e8888c22"},"parent_block_identifier":{"hash":"0xcac349a80dd13f66ecd31d7f2b863d52ef32ee0e2504b7907f1f052e176066ba","index":99785},"timestamp":1678271139,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736c6b666e616c736b6e66)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x736c6b666e616c736b6e66"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000000f0000000000000bb8000090cf827565bd18d86f094cc3d107f1f8d1479521a2902ee67263cea514f2310f24a496e289107a649a3917f179d308640025b4494a593bdf8f11b8faf1869677030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b736c6b666e616c736b6e66","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a7a04686173680200000000086d657461646174610c00000004046e616d65020000000b736c6b666e616c736b6e66096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x1a9c22c7481c6be8cf6df358525b2fca3f13f8862d11be156d1d68c238e5632a"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6e6a6276747974)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6e6a6276747974"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004006684c7aac54fb4eb6ce79b232102f1522560ffa0000000000000000f0000000000000bb800005a386572a99ddc51bd741fa702fa8471ce9b048a6f5735b5289afc42e4a9aa6b5fd2998d5a01ea32c50a07567e22919ee79a35f0f2d47cc14047d0215608568d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086b6e6a6276747974","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a7b04686173680200000000086d657461646174610c00000004046e616d6502000000086b6e6a6276747974096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6684c7aac54fb4eb6ce79b232102f1522560ffa0","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1K89HXARN7V9TVCWYDJ6882Y592AR7ZM0WDV711","success":true},"operations":[],"transaction_identifier":{"hash":"0x0aebd51bcfe1fd397a446b4b47648b4f008b42cdc031335c7a35c91d550dc676"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737437)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c09778776000000000000000a0000000000000bb80001a874e4cb1b754a9ad64b7a0e6b9c3e82eddae030625b14b791fd30f59447b12c243414486a9495b0d07d70c67b2704ad9193e72998691db96425595359508562030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a7c04686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0x82e34b9124fffac169c77949b5ed3c2ce131c9b5e65ce61ef5aba28b74a7ebf5"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6c7764444d74d93e31acb7ff3eae26e95193f0ebbd530b1a3cc80f0aeab06e22","index":99788},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000046026e15b0dc4aedd826f3488f6cbac7175fd7c61ba1fa5b53f1","index":2423397},"confirm_microblock_identifier":{"hash":"0xecdd40cd6b19d1e77f94b6fb943ca797be1f00218458dd2dbeaa43973c46da67","index":4},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":246,"stacks_block_hash":"0x96444bdb4670b27bdece8fe710de4b3220ca9a852db6ab73f3274f07eba8793b"},"parent_block_identifier":{"hash":"0x6453faab796a15a000a792f691effe620d32c41a165a6ba980fa2e6e546560ee","index":99787},"timestamp":1678272937,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736b6a646e76736b6a646e76)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x736b6a646e76736b6a646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":6},"proof":null,"raw_tx":"0x808000000004005d35a7e8d4600d0285ec0b3a97f764c750e415d400000000000000140000000000000bb80001afd42b64db3f0dae526d582890fad2cd37808b1ef200c344e30f5e13f19b2df10575c6a9e18d6f69cac02aa9c57d5bc945245a6fd4c5d719a56466fac3b35de9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c736b6a646e76736b6a646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a7e04686173680200000000086d657461646174610c00000004046e616d65020000000c736b6a646e76736b6a646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5d35a7e8d4600d0285ec0b3a97f764c750e415d4","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1EKB9Z8THG0T0M5XG5KN5ZQCK3N1S0NTJ3R9R4W","success":true},"operations":[],"transaction_identifier":{"hash":"0x0d716e0748b32b419b53caa2c435c95c003a97ae3bcb3eac5cb16f864ef0775b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x1c317bcbb94591dd1a2b1ade7d0ef46ce9ef00f9795a52f5270fe50ce2ac1188","index":99790},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000001a3d130eb7a3c8bb7ad6ac77af85933e888e5aaa9f51cf85bc2e","index":2423399},"confirm_microblock_identifier":{"hash":"0x5c431b9fe31cb5cd3e41d21ed3345d8f51a362d539d7ec230912b822daf62b33","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":248,"stacks_block_hash":"0xb23096010d605139172fa94853612b8324fccff737c4d512f6bc6ee79c75b982"},"parent_block_identifier":{"hash":"0xc2c28c2578574f90e401a31adc68f3f89d521d4436b5c711210624679b6ee1ec","index":99789},"timestamp":1678275350,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c616c77616865656474657374)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3500,"kind":{"data":{"args":["0x627463","0x62696c616c77616865656474657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":40,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400e7b3490e967732af9f66600fa6177adfa987601000000000000000280000000000000dac00002182ebfeba28924c602551866d786d7ba9f477ce575952884ea48b4e8fb4555a171abc3b87bd841f91ab20210de3ec5eebca5972f4272df22c003196c2a020e2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f62696c616c77616865656474657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a8004686173680200000000086d657461646174610c00000004046e616d65020000000f62696c616c77616865656474657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae7b3490e967732af9f66600fa6177adfa9876010","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3KV6J8EJSVK5BWZCSG0Z9GQFBFTK1V0231DJR93","success":true},"operations":[],"transaction_identifier":{"hash":"0x7e697fdbcc8d75332cbea90e4a22fe67f54fea89721168a4028f166da1110e35"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8c7593f0d2708fbe09403dd7c2e14f53fb284e78a1c89618b9f2dadbd9bdc89b","index":99885},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000001caad663661b57914736f0afa77fc262e23a31b11e3c90bc8ddf","index":2423530},"confirm_microblock_identifier":{"hash":"0x636b3a8356e434eff659fecc1af15f27f18c6fecb75eb6cb2d4836ae1a299309","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":379,"stacks_block_hash":"0xf1c49a100afbb21f4a4a709a93de378b29f0073484886e14e60f7aea5421584e"},"parent_block_identifier":{"hash":"0xd82bd92ae35bd34e81b45259ad4d8a8a70fa44f146fd8506775a18712264e2fe","index":99884},"timestamp":1678357444,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737438)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737438"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c09778776000000000000000c0000000000000bb800008fba52f89cdec2ccf6b1cac66118a861784352d1c0225fd88abaeb544f2518f93544851463194126f4dcbb063e867d8444732fc1fbfc36cab1c428e171a74c66030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737438","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a8704686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737438096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xddb8d8a0e0b3b31c56bfe8562f6bfe1f59ce9c0236570ec75b47a8ac9bc0736d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfe63d9a6573b0c0b250e090a7719037275d02f368823da02c2f5e7f2ba9392d0","index":99886},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000e3421d738b27d2d3be53b24b40af040a15d226ad9fb506f4a","index":2423531},"confirm_microblock_identifier":{"hash":"0x38616c97155651938325d5b083bf0db8f717edb27ecabcc698e75a0ff0bb5de7","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":380,"stacks_block_hash":"0xe8f5ea28fb2b9578b3370df74fc424a17aa6a12989a1318cff5dc5198257c62c"},"parent_block_identifier":{"hash":"0x8c7593f0d2708fbe09403dd7c2e14f53fb284e78a1c89618b9f2dadbd9bdc89b","index":99885},"timestamp":1678358670,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646c636b6e73646c6b636e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x73646c636b6e73646c6b636e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400b3da287721fa4da8bd83f475051f1b14deae1a4f00000000000000020000000000000bb80000f5d77114014615c142e3db46f25346da1456210d1c6936be7c85f85ebaed0731327640f25f26df7cd9c9dff1e78fc9372aa51487cd1e99c66e22bddd7e78146d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c73646c636b6e73646c6b636e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a8804686173680200000000086d657461646174610c00000004046e616d65020000000c73646c636b6e73646c6b636e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab3da287721fa4da8bd83f475051f1b14deae1a4f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2SXMA3Q47X4VA5XGFT7A18Z3CADXBGT9WWQ3TF5","success":true},"operations":[],"transaction_identifier":{"hash":"0x30fc598f6bb47d16580667c80de29349b827b85a5a2db72c26dff1e2d23adac0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x304097c427951d217ff6c555c88b1add9163e1e5b6436fe45a3cf12144cf8ffd","index":99889},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000013b685a018720c7495f692da52b40244869752a0c03d4947d4","index":2423534},"confirm_microblock_identifier":{"hash":"0x9158052797945cfc2f2042527ff3d0c88d11f968e8cb304f720fdec6f7bdc200","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":383,"stacks_block_hash":"0xb45a6f756c5556739b19f6c671c356310960882f943b6e8ab8994c8ffee7e232"},"parent_block_identifier":{"hash":"0xf03402bb6c8da3bef1ae2f25aa84378576e2e1ee3b88c068ed421a10112ce69a","index":99888},"timestamp":1678360258,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x69776568666f7765696866)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x69776568666f7765696866"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000100000000000000bb800006944b73301efaff380ebc56c49d94e47729abcf5339edfedbb6bb1e340a496594627f2ccc9afa75104409f36ce5889c8167ac258ce342b34037f079c177a2341030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b69776568666f7765696866","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a8d04686173680200000000086d657461646174610c00000004046e616d65020000000b69776568666f7765696866096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0x1cc62267ea588f733d4aabe7828838d07d1f790c5a8b94a22c197d014727c29d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x40cb03684b5f322ec264b34edb198e8514cadbed60b2834bc3db1ef61bc660af","index":99904},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000031bbc2ac258d2a3bbf4e96f891650ceb2759a8fe498927f06","index":2423549},"confirm_microblock_identifier":{"hash":"0xe05cd6a61455f9e1e491153012dd44cef896eb56375efb44acecba0c92ea7e39","index":1},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":398,"stacks_block_hash":"0x2c7003b12bb09ca00f35abf03d776464a8442c15d26c7fe7fc0b4fc59919c99e"},"parent_block_identifier":{"hash":"0x40d395104bb911d1582a0c08fb377e8de6edd30f330e912abacc12b1744a85d6","index":99903},"timestamp":1678368778,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b616c736e6e76716f7769626e76)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b616c736e6e76716f7769626e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":21,"position":{"index":2},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000150000000000000bb80000d8a9b1a41be52fd952559a04a91b99fcfeb45f63cf3a63176af2d405134b8d11496b6a913534ad4cfa1e0f6805357ff8d791adfe1600dbd6777f00a8747fb784030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6b616c736e6e76716f7769626e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a9004686173680200000000086d657461646174610c00000004046e616d65020000000e6b616c736e6e76716f7769626e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0xa0c27fc125524c6dbe90f040ebc32fc6e047600cb6970be6546cb2407ff08fc2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xeb738b7806ca38ceef610122237d04c1e38068b29578e384869df28d4c7aba33","index":99907},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000221f3ae243dea7c2107801c62fff4959b5d89ebe5a685f90d1","index":2423553},"confirm_microblock_identifier":{"hash":"0x2ce24463778ae4cc7f0adf74807ce6d7ab364b54c4ead31adabdbb00168a524b","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":402,"stacks_block_hash":"0x050c078b40986917c9c383c8edb9bf9dfed8ab6a323dbf5b2c0e0e869cf5c935"},"parent_block_identifier":{"hash":"0x7d3ca9d1b64fc3c2174b87a6201b271bb99978f9c099f4f00a0c3f7552893e44","index":99906},"timestamp":1678370543,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736a646e73616b646c6a766e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x736a646e73616b646c6a766e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":5},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000130000000000000bb8000153819438d89eb673984df0daed0e38805f04ae29d7180d59e03edbd25a5f0b5844b5f07df2b9b0265a4b648dcbc13ae82f0038ce4c06a77bf8d5fdd158acc079030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c736a646e73616b646c6a766e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a9504686173680200000000086d657461646174610c00000004046e616d65020000000c736a646e73616b646c6a766e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xe68888e240001a008f11295309b72600866babd2ca5b3f7e68c9c602d118f6bc"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x61ca3f5f8042a5abcaf5dc22f344ea2124fecb44765099ba0077d86ad95b0b3e","index":100012},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000002d620e3e3ddc7afde62d3a236ab7236a45741a0ee4dfbcb75026","index":2423861},"confirm_microblock_identifier":{"hash":"0x2a014f043afbfca3b4fc1708c643cb9435aabfaf6bd5d38976867b16afacfb2f","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":710,"stacks_block_hash":"0x54d172205e54dfdfae5b944eff76898ccc02fba054ba56d693d1af76f1b508ba"},"parent_block_identifier":{"hash":"0xcae9caf8b336c423af87c16538a96aea8c3c8da96f1d606f56c1e9d0e9867a71","index":100011},"timestamp":1678441865,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616b6b73636e61736c6b6e63)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x616b6b73636e61736c6b6e63"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":26,"position":{"index":4},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a000000000000001a0000000000000bb8000172bb49ef56d27f09464d73f41b0f73754238f982aab8c42769feab0378e366d8048e9e03158e56df0e44e866234342f2f6fec724113dee1bdcf14719537d9617030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c616b6b73636e61736c6b6e63","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000a9c04686173680200000000086d657461646174610c00000004046e616d65020000000c616b6b73636e61736c6b6e63096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x716f614ec83f8dad1e1458bac54816bf2069ca2b68c673bd8bf40acc90e4d152"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0cd10149b8c8f51d9d9d923c16f7610c6e81aa36354307f609668ca8f7ac3fba","index":100024},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000c3a281db766ef2e595dd3192affaa0b58084f9c70ff89a30e","index":2423874},"confirm_microblock_identifier":{"hash":"0xeaff545338097583919f9c81e31994f09722884f49cd3d21098e04c94bdebf41","index":0},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":723,"stacks_block_hash":"0x2c2126814acf66f34da6a84c5636152aac6b4a740117c72d3152070384748301"},"parent_block_identifier":{"hash":"0x6b23dd43bc6e9b4a8c998566c5664bcd29e67e7efb73271f8f7b03cf9d5a7d65","index":100023},"timestamp":1678453537,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x696e6672617465737431)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3500,"kind":{"data":{"args":["0x627463","0x696e6672617465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":59,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a8000000000000003b0000000000000dac0001488ea8ab61dacfecce0c4a4b090dbbc31d26b56f8c279a66d4f05dba4382cb42091076f0456d9a1208f3e2b4b9b4b1fe3416cb0de1b3bf046b8119ff2980ea52030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a696e6672617465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aa104686173680200000000086d657461646174610c00000004046e616d65020000000a696e6672617465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x7584aa8d12544efbefb58b3446bdd26798ebedb8b83137d9c48c3f1446b91a3f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x638056fe7498f67a42c29de1a53995c6fdc69e612824ffc9ec43258926ec0dde","index":100027},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000023f0db843302ef311cce7a0de0d93f3c8534ea48398eee5bbd60","index":2423877},"confirm_microblock_identifier":{"hash":"0x4981cb868ad0c924a4a5d9214ce83669f002b50916f538d6c96ecc75e94ebb80","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":726,"stacks_block_hash":"0x9e149fbc3b75398f4dca01fc5a26be8519774a896c10a049f796bcfffc1f42d0"},"parent_block_identifier":{"hash":"0x8a35f1554e4abedad8ab129ce33ff97e15dbead760e307e39e7b6c439521d079","index":100026},"timestamp":1678455668,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f7774657374)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f7774657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":31,"position":{"index":9},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a000000000000001f0000000000000bb8000044c0a0eee0eaf8144d398e1dec070f061d37915ded83c42a4202c238bc1525d424edfab1fd4d9751666621f32c0a295d35b1a26de3cd588c8bacdba784b4b877030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008666c6f7774657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aa404686173680200000000086d657461646174610c00000004046e616d650200000008666c6f7774657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x9fb65f97b653241c039f8585909f4fe9cf433a1135020c4f4c3c750bc0247d07"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5d90fbceac51bba8b714941121c08ff9e64b7caae8ccd56c796e87ce90d8a53b","index":100030},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a5be47d53483528e42bfe2adc822a050db963958b46e68995","index":2423880},"confirm_microblock_identifier":{"hash":"0x9235820a76b9a7d6714977121dc6451ba9952800c835ff7b9eba9e227cd7ac83","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":729,"stacks_block_hash":"0x1e3d409c45b758ee3b1e6d0383ea5bff589048ad31241572cd329372d77623dc"},"parent_block_identifier":{"hash":"0x3b98b55bf9248c3e924e0202e459739196fb30f3749fd9a520058b10b3dda635","index":100029},"timestamp":1678457892,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d7465737431)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3500,"kind":{"data":{"args":["0x627463","0x312d74782d7465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":61,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400ef29ee95fc9093bd6d968fec5f005495939d86a8000000000000003d0000000000000dac00019fad466f54eade3489a71aa9c02a573584bf18fb3cd48590f87402482dcbabe223b9fff9b96a2d2e4f2fd0c6be5912061092dc8c6f89353991dfdda9b82caeec030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a312d74782d7465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aa504686173680200000000086d657461646174610c00000004046e616d65020000000a312d74782d7465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef29ee95fc9093bd6d968fec5f005495939d86a8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QJKVMNZJ897FBDJT7YRQR0AJAS77C6N04SVV51","success":true},"operations":[],"transaction_identifier":{"hash":"0x5b216338489bb405c7652dcb649cdfc7208f3e54d432585f8f7f9dc81eaf7220"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x188affb381441b5c7ba179c81afbe5f117024401465a73ed5ece6acd6b56592c","index":100031},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000035e08af0b08ea06c0aa607ae1b788d7dcef5e43d785d35119864","index":2423881},"confirm_microblock_identifier":{"hash":"0x32e33ae3bd13de063542f855e76babafa8e2985349f7a35361256553c5146a4e","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":730,"stacks_block_hash":"0x94489ee9811815d4382128c1ed1104c0fcabfc1cb94f09cfdf51da39f9421477"},"parent_block_identifier":{"hash":"0x5d90fbceac51bba8b714941121c08ff9e64b7caae8ccd56c796e87ce90d8a53b","index":100030},"timestamp":1678459013,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737431)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c505e4f648d2d5228ffe2c5a425dc49ff52bc74400000000000000020000000000000bb8000071ac309292c4612917afec3f24dd6fc3faeb5c1fcdb757e193ab73ba7416dc9e6eeef1670fdde0f7ac3a531ffe7f478c4eebd710d49220fdb239df1a9aa9dc51030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aa704686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac505e4f648d2d5228ffe2c5a425dc49ff52bc744","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32GBS7P939DA8MFZRP5MGJXRJFZAAY78GZFNYNH","success":true},"operations":[],"transaction_identifier":{"hash":"0x3e92f1b24d22bfd7879cc4fccbe463ce06470128df702ff37822d57a82ff9263"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xed8348f9cdb1499656aa060eaff99c0a39f1dbc078b6893fa08ff348213d10b3","index":100045},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000004ee664a5688aa221fe6bfaa06eb2add27bcd7f0450b28aa9be254f2","index":2423895},"confirm_microblock_identifier":{"hash":"0x694e566dbc28b782724bdfe87bc0170d47f33a5dcaa1cc721647087862c8fc19","index":3},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":744,"stacks_block_hash":"0xb0aec78fac1d460880dde3f356a40d3d51e4f5db1096b042adb66eaf1079774e"},"parent_block_identifier":{"hash":"0x875acd6850466535516b562b832b1e119f052860feeffa6a3f18947f652384fa","index":100044},"timestamp":1678470224,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f777465737431)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f777465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":36,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000240000000000000bb8000184d6bf8140be9570f4079b9d189518a7ba922abe425458ab81bae305fe74c1583f904843f66989790321d4d9f300f8f1a3748f82d91d6b60f1c1803dfafdb47a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009666c6f777465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aae04686173680200000000086d657461646174610c00000004046e616d650200000009666c6f777465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x6e531273b5388eb3f4cccd3ad4ccefe5d2fe6b4f59f1534ab93cb1760be28f5b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3e7c61886034a46270d0b546795a49cc8df4669460d19641eed1c00a94cdf007","index":100215},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000004478cb2a7575ab16d4972ee3cef41b202793d3003b34e7b50","index":2424102},"confirm_microblock_identifier":{"hash":"0x43c99c89b3aa4fb551fda4cf7485ff2fb11a2974a709815710438a788a1c147e","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":951,"stacks_block_hash":"0x285e9bae9fd2120c798f180169dd49b035214d68c9829120f20450403fc83bc3"},"parent_block_identifier":{"hash":"0x1c64d4be48833fd2c4d864888f894e41cc1c44a3a71703ac7ee008c0cd3e7068","index":100214},"timestamp":1678631904,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d3637303030303032)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d3637303030303032"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c1ec276e335e5dc1dea60a077cf35fe9db6f2d1b00000000000000010000000000000bb80001234c67a6011b833941342da649d57717135b148db3253aa2ca54c95b194bd4a359e6253478e5d7f45e987bc96625f8e9fbb61637cc7422fd54fc043a1de265ff030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d312d74782d3637303030303032","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ab604686173680200000000086d657461646174610c00000004046e616d65020000000d312d74782d3637303030303032096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac1ec276e335e5dc1dea60a077cf35fe9db6f2d1b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST30YR9VE6DF5VGEYMR50EZ7KBZMXPVSD3EGGTCY0","success":true},"operations":[],"transaction_identifier":{"hash":"0x403d194f9b8e1789a9081662f4b53314a8b8ceee32489c62b962d124c1fa38ee"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0c502a332f2c6dbec3faa949d0fefa6edaffbb4723a3c0cdb43e7b44884505b5","index":100283},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000b8894b2a73c294bd9b2d4303929a8c280926d11d0bb4b2867","index":2424197},"confirm_microblock_identifier":{"hash":"0x59e6cbe77370e4b56aa612ed9bd9c5d29012864a2489a88660907247c1aa3523","index":2},"pox_cycle_index":403,"pox_cycle_length":1050,"pox_cycle_position":1046,"stacks_block_hash":"0xa54151a46e913847aa8e8084bfc10fd7b543284239ef2751ce4ce1a283ee867e"},"parent_block_identifier":{"hash":"0x7c87da4aed1c5967b682890e4af1e42fb84937394b6fcdf533d09a88951bc506","index":100282},"timestamp":1678703029,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d70726f63657373696e67)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d70726f63657373696e67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004001e9dd422cec4fa9d8ff291814043e385ff645e7500000000000000010000000000000bb80001a82691a9388c5590393b24deb20049c6a341070ba94ebcfe80acf5105c5c12ce2f5c6782da9a3fcb55cc7f3b36100d9005ba915bd07295e9eb4db8b7bae59f4a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f312d74782d70726f63657373696e67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aba04686173680200000000086d657461646174610c00000004046e616d65020000000f312d74782d70726f63657373696e67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1e9dd422cec4fa9d8ff291814043e385ff645e75","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STF9VN12SV2FN7CFYA8R2G23WE2ZYS2YEN8CE0XM","success":true},"operations":[],"transaction_identifier":{"hash":"0x385d89ece246267a3004cc3df58ad479cb9e6950bffda9a4196d452ef1bef46a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xa1eb92fcf69b102faa07afefd2b93ceceb691e9b0c80d73f17d70be63851f40c","index":100284},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000278f88d6f30e23d1377d51ecc406d3f9d2b5ed4e0c6a5c5725","index":2424204},"confirm_microblock_identifier":{"hash":"0xc2cf64fdbd226db41a8779de6af77570be5c77f4676498609e2dd0bdc2436b9b","index":16},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":3,"stacks_block_hash":"0xfba4b9c3f309891c45a9b0b28a7b5164a2b522be814c6a8e2049916a1ea9d14d"},"parent_block_identifier":{"hash":"0x0c502a332f2c6dbec3faa949d0fefa6edaffbb4723a3c0cdb43e7b44884505b5","index":100283},"timestamp":1678703872,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d37383930303038383939)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d37383930303038383939"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400c1ec276e335e5dc1dea60a077cf35fe9db6f2d1b00000000000000030000000000000bb80000ca3e4fe199fd9aa6cd11f69806128738ac3a3c80910572251804f050c8347b852dd967b26701bf1438170fc3e3515149ac50bf71593b4a482bcee41a2e495852030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f312d74782d37383930303038383939","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000abb04686173680200000000086d657461646174610c00000004046e616d65020000000f312d74782d37383930303038383939096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac1ec276e335e5dc1dea60a077cf35fe9db6f2d1b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST30YR9VE6DF5VGEYMR50EZ7KBZMXPVSD3EGGTCY0","success":true},"operations":[],"transaction_identifier":{"hash":"0x161cc28052ae2636317a6285a876afeea81380fde36bf58e6adb75ee14affafd"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737436)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737436"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":8},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d300000000000000000000000000000bb80000cced3bbb9c54fec25dbc66a55dd531ea0a62f17104ebcf2550828b196533725e6557d90c9f1bf100e03700578d2f9ce8450f5fdac2a3cb5d48d4728e203ec91c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737436","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000abc04686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737436096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0xdd20779a16a217fd5bfcee6e88956a82ef1726e85572bbf5817abe2a6f96381e"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x617363616373617363)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x617363616373617363"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":11},"proof":null,"raw_tx":"0x80800000000400c30d9ea5321592df016f6a3fa91f07c6927d1e2300000000000000140000000000000bb8000028a3d5c1b2fbd215a8e28e97544bd7a2a5548f36c7fdd4866e4a1476b9fb32057455e144b749d17af1f8570e70334dcd5516f37d49226e0076296e02d3236d8a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009617363616373617363","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000abe04686173680200000000086d657461646174610c00000004046e616d650200000009617363616373617363096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac30d9ea5321592df016f6a3fa91f07c6927d1e23","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST31GV7N568AS5QR1DXN3ZA8Z0Z394Z8Y4C5J1Q9E","success":true},"operations":[],"transaction_identifier":{"hash":"0x89b37a7100140f9106733bc9f13b936ae31a1c9452a9f2d710090a0631c51841"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7364636b6a6e73646b636a6e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x7364636b6a6e73646b636a6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":18},"proof":null,"raw_tx":"0x80800000000400c505e4f648d2d5228ffe2c5a425dc49ff52bc74400000000000000070000000000000bb8000082283489e866ed2bb71d8cee2ef2b6d67eac5793bdf6314ac817983ab0e0d8e51c202d9340b0a8c12557f56ed70da7c4f96d3384cfdc26818064416749b13735030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c7364636b6a6e73646b636a6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ac104686173680200000000086d657461646174610c00000004046e616d65020000000c7364636b6a6e73646b636a6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac505e4f648d2d5228ffe2c5a425dc49ff52bc744","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32GBS7P939DA8MFZRP5MGJXRJFZAAY78GZFNYNH","success":true},"operations":[],"transaction_identifier":{"hash":"0xc1f57a7c63792f44c9e3d3b30ec3fcdab2b626ce105ff224a16f21913dac598b"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646661736664736176)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3500,"kind":{"data":{"args":["0x627463","0x646661736664736176"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":21},"proof":null,"raw_tx":"0x808000000004002fb0ec2ba051fcda050d1ad134b72297edc9ca2200000000000000070000000000000dac00010d1abd3bdc91a5a6b2d9bdd16af7bfb01c55b83ddd71d6cf39718c78f8cf40524ca7e90f3e38167c3d61cf3fa2a393af4ef3733e4bf65318338b4edf04b8fa4d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009646661736664736176","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ac204686173680200000000086d657461646174610c00000004046e616d650200000009646661736664736176096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2fb0ec2ba051fcda050d1ad134b72297edc9ca22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STQV1V1BM18ZSPG51MDD2D5Q4ABYVJEA48K29AKB","success":true},"operations":[],"transaction_identifier":{"hash":"0xf14e190e36901f73940d29b107d7859019befa1a48723497e673dc6de6563ae1"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72616e646f6d7465737431)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x72616e646f6d7465737431"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":22},"proof":null,"raw_tx":"0x808000000004005cc58c2d9ed572a394f18eecfb8b8379a0c9dd9c00000000000000020000000000000dac00008d0f0deb1389e3753e35a36541e05e63673c3b668f2f91ee5fc69e2e59ed565d75731e19fb1a679e59e165ca5ac266991465dd53857e07cfc88c2b85c3d7b726030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72616e646f6d7465737431","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ac304686173680200000000086d657461646174610c00000004046e616d65020000000b72616e646f6d7465737431096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a5cc58c2d9ed572a394f18eecfb8b8379a0c9dd9c","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ECB31DKVAQ58WMY67ESYWBGDWT1JEXKH947KJ6","success":true},"operations":[],"transaction_identifier":{"hash":"0x49324ee18602b17ca0decf23aaa17ce7586411a7b5d92036ec3f995801b0253c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72616e646f6d7465737432)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3500,"kind":{"data":{"args":["0x627463","0x72616e646f6d7465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":20,"position":{"index":23},"proof":null,"raw_tx":"0x808000000004001774a586f815ec30cc44bec4f78c27571e33d22600000000000000140000000000000dac0001326f3ad683027ab7601c1f2046edb5eee168301ffbc7b0e77d42727a7ae0a1f12fd33d9d27bf3052b2ff4408083840023490dadd3960ddab21de5a43b20b749e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b72616e646f6d7465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ac404686173680200000000086d657461646174610c00000004046e616d65020000000b72616e646f6d7465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1774a586f815ec30cc44bec4f78c27571e33d226","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STBQ99C6Z0AYRC6C8JZC9XWC4XBHWCYJ4TXSKV4A","success":true},"operations":[],"transaction_identifier":{"hash":"0x9bcc2d3c8ceb6e4bfe486bba3bbde1cb6d5c3519c5b617fb322959ca2d1e14a0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x65646765636173657465737432)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":3500,"kind":{"data":{"args":["0x627463","0x65646765636173657465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":25},"proof":null,"raw_tx":"0x80800000000400a5a51de2c7c7ede9ddf31d05c9cf1edcf4e22d8700000000000000050000000000000dac0001c3540817368e5a89624f724cefa9a48e20f9de9b0564b982b8543807685b7a4933aad43a3e2902643246dbe685fb594108ae1b5e69246bc2b163f0eb68063984030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d65646765636173657465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ac504686173680200000000086d657461646174610c00000004046e616d65020000000d65646765636173657465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa5a51de2c7c7ede9ddf31d05c9cf1edcf4e22d87","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2JTA7F2RZ3YVTEXYCEGBJEF3VEF9RHDGZJ5D672","success":true},"operations":[],"transaction_identifier":{"hash":"0x25d3b8bdf401c3e35689d07f02833e96b183116f0f6bef06fc83ce5b58da44f7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb7c4dbf961f0b9067a042a181aa977fb6e5df7360b821c28c33cf86da6f9cd66","index":100287},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000d26c8a2ecba3ebc8f9a1c865a148f3a43e5bcbdda51dceea6d74","index":2424213},"confirm_microblock_identifier":{"hash":"0x68d9477f31cc86e9e107af3fc2cba1d1132a4977779ac924c68c54acfca209d3","index":10},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":12,"stacks_block_hash":"0xadaa17247a58aed3bb6ebba51a5e679b8a7ad7af3baeb8ce739a9ad5d8e63dcd"},"parent_block_identifier":{"hash":"0xef049af793c838db15d13517e28fe2c13bffd5590a9c20d58501853d8a6dc908","index":100286},"timestamp":1678708363,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77746573743535)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77746573743535"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400c505e4f648d2d5228ffe2c5a425dc49ff52bc74400000000000000090000000000000bb8000083be4e7719d51f6578f6e61408d7a88c0535d17c5d777a4d4823e3676a094e5a1c4df394cae7ec9cb9fbc2616bb97baa3bfdf3cc66d2a118a3034040e231855c010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a666c6f77746573743535","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ad104686173680200000000086d657461646174610c00000004046e616d65020000000a666c6f77746573743535096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac505e4f648d2d5228ffe2c5a425dc49ff52bc744","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32GBS7P939DA8MFZRP5MGJXRJFZAAY78GZFNYNH","success":true},"operations":[],"transaction_identifier":{"hash":"0xa17c6a8b06bbd0a875a4ce705b6e77b8dda069cf7fcc30d1d90ddf659bb259c7"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77746573743637)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77746573743637"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400eabeadb9fd7309492cff225e01194b79b80ea39f00000000000000040000000000000bb80001f9acb5549b7c939a678b9e2d6f7caca12878271aeb4e9834aa41f47c9e9018e95da4b32b511f9bc274f1b365808f6fe9e5f8e115e01b2025c3ed55aec2481469010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a666c6f77746573743637","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ad204686173680200000000086d657461646174610c00000004046e616d65020000000a666c6f77746573743637096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aeabeadb9fd7309492cff225e01194b79b80ea39f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3NBXBDSZNSGJJ9CZWH5W08S9DWVG3N3KYDK21AV","success":true},"operations":[],"transaction_identifier":{"hash":"0xe89735ea2d09557eafacee2111a8ea4a409ed683469fcfbf06c760840e8cfea8"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a6f6e652d74657374)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x7a6f6e652d74657374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":7},"proof":null,"raw_tx":"0x808000000004001e9dd422cec4fa9d8ff291814043e385ff645e7500000000000000030000000000000bb80000253ec8c8e4ba2ccae120f3188c28b7f77c79771e86a711f3392f2897e3a62f1a1bf6ce8f14639f8b697f7f6e438587e4bc481c67407032bd75983b95997d7424030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a6f6e652d74657374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000acb04686173680200000000086d657461646174610c00000004046e616d6502000000097a6f6e652d74657374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1e9dd422cec4fa9d8ff291814043e385ff645e75","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STF9VN12SV2FN7CFYA8R2G23WE2ZYS2YEN8CE0XM","success":true},"operations":[],"transaction_identifier":{"hash":"0x2fcfa69acf9daf19c81eea9ad9f4d1ab26dea85e6d4d2f38193f9779f00380e6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8b8446bf0cc3c6d2aad8b37b65a25faaebd1b76f8d9b41890525ee0450f350a9","index":100293},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000018c67ba970c8b40c6cbe08736b97645d6ae8869c6262310a80","index":2424297},"confirm_microblock_identifier":{"hash":"0x6c0f39836b78f11c8ad9088309fd2c841954ac64bfd38c1cdecbfab1a954665d","index":62},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":96,"stacks_block_hash":"0xf9bc5186adc8234c78f55d4266ed424b6b30251fe416d3f291bc8a6be601d5e5"},"parent_block_identifier":{"hash":"0xf8f9c3be42817deb75f7d544fd9e7e5659f1d83aad6f8eefe0053b1b1bb4f9b5","index":100292},"timestamp":1678712852,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6372617a7979797979)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6372617a7979797979"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":39},"proof":null,"raw_tx":"0x80800000000400ae9268d2dfdf7c712b23a39e0b0a81fda9205cc500000000000000040000000000000bb8000007df715bec28fdc8ed97a34434d89f45a17b69d16bc107302295eae6fc03027d3f306ff1d05436a80049113b5ff900c4f2994b906a30a4fbd58eac87b6677a02030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096372617a7979797979","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ad804686173680200000000086d657461646174610c00000004046e616d6502000000096372617a7979797979096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aae9268d2dfdf7c712b23a39e0b0a81fda9205cc5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2Q94T6JVZFQRW9B4EHSW2RAG7YTJ82WRQASBW9X","success":true},"operations":[],"transaction_identifier":{"hash":"0x06c29bdf52ca6bf492a6b46ee8c2d9fc9d8950484e4967fcaaad8418769c4be7"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a6f6e652d66696c65)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x7a6f6e652d66696c65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":41},"proof":null,"raw_tx":"0x8080000000040022ee654fac2990d26487b3a6af4874e4677705b200000000000000020000000000000bb80001f1d6eb108cac4bbf4260040a00b5d9fa32933ac25f03c7ca26b44ca7b3cde2e57439739a56058d4fe24f3b39edba6c8be7b97e1107e2f6e3c8b3918027ae02ac030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a6f6e652d66696c65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ad904686173680200000000086d657461646174610c00000004046e616d6502000000097a6f6e652d66696c65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a22ee654fac2990d26487b3a6af4874e4677705b2","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STHEWSAFNGMS1MK4GYSTDBT8EKJ6EXR5PA2RVDEM","success":true},"operations":[],"transaction_identifier":{"hash":"0xd7cb5369603585e1a90f51eb330c5fadb17748287d6bcd82c791cf355c2f3571"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d616e6167652d2d706167652d3232)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d616e6167652d2d706167652d3232"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":42},"proof":null,"raw_tx":"0x80800000000400b40025714a64d3e84a98768e0e34a716eedaffce00000000000000080000000000000bb80001c9a954ea56a902ff5eb7d998054008d51269c80088bb0b8785aad39408bfff923f00f81fcc0689497887518ac018dc1f9f247a77b471305de79bf7a7d94a6959030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6d616e6167652d2d706167652d3232","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ada04686173680200000000086d657461646174610c00000004046e616d65020000000f6d616e6167652d2d706167652d3232096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab40025714a64d3e84a98768e0e34a716eedaffce","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2T009BH99JD7T2AK1V8W3HMMWBEXPQZSV808DH9","success":true},"operations":[],"transaction_identifier":{"hash":"0x29d8f3c3461b509d5b1fd9bc374773795995cb1e2db2df3906f07a3c142153fb"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616a6565622d313030)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x616a6565622d313030"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":44},"proof":null,"raw_tx":"0x808000000004001057ff3746289ce361da37defe34e69847904d8900000000000000010000000000000bb8000016ea037ab501ed5b6f7465dba221a46114e7ed4fc23581cb3c6a26d102662fb35459536e7cec4dfa6473edaebbaf41137c452ceff46ce41d2d724003b9389377030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009616a6565622d313030","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000adb04686173680200000000086d657461646174610c00000004046e616d650200000009616a6565622d313030096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1057ff3746289ce361da37defe34e69847904d89","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST85FZSQ8RM9SRV1V8VXXZHMWTC4F42DH78J2ESV","success":true},"operations":[],"transaction_identifier":{"hash":"0xb5fe931d1f58adbdecde4f73382044c302e516ccf84f78864b94f4a074bad195"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d3230)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x312d74782d3230"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":46},"proof":null,"raw_tx":"0x808000000004008f914089eaee5eea997148a86f055466f3b1effd00000000000000010000000000000dac000084ad7751dce1d3f83854457cc797333d0dfe2f7b5fc10fc923fd23b06f0ea81571ff19c54f6e4716b735da2b7807f4ac45b8d647442f35eba69616d3017f0662030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007312d74782d3230","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000adc04686173680200000000086d657461646174610c00000004046e616d650200000007312d74782d3230096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a8f914089eaee5eea997148a86f055466f3b1effd","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST27S2G49XBQ5XTMSE54AGVR5AHKF7CFFZPFTE3EJ","success":true},"operations":[],"transaction_identifier":{"hash":"0x59940688c9a24d1e53ca77c86ef4888f021dedbc45a88daa4479966820bb726d"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d69696e6e69692d31303030303030)","execution_cost":{"read_count":6,"read_length":42527,"runtime":58303,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d69696e6e69692d31303030303030"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":64},"proof":null,"raw_tx":"0x80800000000400949068e9eaecfdf22ae0845ba3ff067e269a953a00000000000000010000000000000bb80000b7edf20534038b57bdbad785a692952453acaa03e568e721921fa1f7464fe8af343cbe180ddb7c8967502eb86efaecf15e42b8200cdcdc25bb02e9aa7b6de2ec030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6d69696e6e69692d31303030303030","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2006)","sender":"ST2A90T79XBPFVWHAW225Q8ZZ0SZ2D6MN797RAK10","success":false},"operations":[],"transaction_identifier":{"hash":"0xf6c99a2b3b8bed504d50c6098c56fbfbe65bb8ea30d7437c4070edf73aff619a"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616a6565622d3530)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x616a6565622d3530"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":66},"proof":null,"raw_tx":"0x80800000000400949068e9eaecfdf22ae0845ba3ff067e269a953a00000000000000020000000000000bb80000a03438393f438e0e8a95543d82cab59787711b2871f97fe2c4a21a3dfa4c148e7402b064ccdcc5b0f6bee73d3ed404d863fe5e0aa5698d8b39d3da940b30e2eb030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008616a6565622d3530","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000add04686173680200000000086d657461646174610c00000004046e616d650200000008616a6565622d3530096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a949068e9eaecfdf22ae0845ba3ff067e269a953a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2A90T79XBPFVWHAW225Q8ZZ0SZ2D6MN797RAK10","success":true},"operations":[],"transaction_identifier":{"hash":"0xaccb766ae8e7cdd683af3b60c5d1b1a4f0505c4077c35b7db1612eca001a0bf7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x96e126f3ee4415eeaa38473e0b56240dad9a05bd919c4dfe185cad3e9b331231","index":100294},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000bec53269ee95d6853b743eb34eede5ac447388fb0852eaa705496b7c","index":2424298},"confirm_microblock_identifier":{"hash":"0x57e26ac547b61e33bc5fdb9b87b81dae2195edf753602a0da09b265c9a0baa3a","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":97,"stacks_block_hash":"0xa1f15d9ad4953b64515a7afb5dca83018a0e13dd7c8a738a36f36fc886fbd178"},"parent_block_identifier":{"hash":"0x8b8446bf0cc3c6d2aad8b37b65a25faaebd1b76f8d9b41890525ee0450f350a9","index":100293},"timestamp":1678754916,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77746573743838)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77746573743838"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":24,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000180000000000000bb80000b650325cc1c61d1f47671a7aaa90e60d0c8294e9a0515030919605e1f37643c714808c07d3a59d0f05319026e9af9405c82b1ccd8bb0b7529b2fde340c4b7ab0010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a666c6f77746573743838","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ae004686173680200000000086d657461646174610c00000004046e616d65020000000a666c6f77746573743838096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xeb34a7e80941e60d361bd1951a8b1ce93cc16b006f1ab3108d63455875b16641"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77746573743730)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77746573743730"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":18,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b00000000000000120000000000000bb800013576685fd4f66b4bf13ebfd2212e62435deaf87aedd11de5aa0e4b907aff2e911ac3a678bc5a2b5dd83291bc04662a2fc86d2c024c97d6a4c4129b76cf24b822010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a666c6f77746573743730","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ae104686173680200000000086d657461646174610c00000004046e616d65020000000a666c6f77746573743730096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x44513b61220bfafee4f040f5d43f426bfb97b2870c71ca7c2a2352cbaa650774"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xfba664d3ffc8644bd3583dfe916e2689d7b4ad2bf48ce0cd445184b5744ae4e9","index":100319},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000bc734cf6bb534c22d8f6229abb731530e16b8bfbefd2b9db52d4eeb6","index":2424338},"confirm_microblock_identifier":{"hash":"0x7bafa016cb10eb965483bbb32512dfc54b108b6c1142f7d23bbbf26b5acdb4fb","index":4},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":137,"stacks_block_hash":"0xcea772789cc6cb4c724b0a1ec3001a0a5990950a43727fc308cdadc9b2994ebd"},"parent_block_identifier":{"hash":"0x8f74794d7d8f369f3fc3ddbd2162d19087cec6514959fd64922d8d6421124ee0","index":100318},"timestamp":1678776457,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77746573743839)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77746573743839"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d300000000000000030000000000000bb800015831f30227e601d295fdb9152feff56d1d5f65a3e63b8147cf8c4f1ca2673b1115a137ddbcb1467815d3b4379093f505154fffb9cdf9e3f25deb7426c4173445010200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a666c6f77746573743839","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ae504686173680200000000086d657461646174610c00000004046e616d65020000000a666c6f77746573743839096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0x4b8274c1fa1c59cefc693d29dac3cdd266ddc735417403471d925aa520d1ad1a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdcb61ae84cda43a92d8c18724e55907faf529527e2433a7ebafd71797a27ae83","index":100322},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a2edd2194c6ce225fb1caf02a34d639add84c8b608794d2c0","index":2424341},"confirm_microblock_identifier":{"hash":"0x19a139c3f6782af20725a7688fa9d7e3e61c2e999f36973065ec2c3468e9946c","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":140,"stacks_block_hash":"0x5b235898573a2b674a746e5ef45d19d7722935c8d212ef9f698b876b1c55801d"},"parent_block_identifier":{"hash":"0xb7134c74a9498014a6ac42d2fe8182dacb5925ac3ce0449c809e027861c0c3f4","index":100321},"timestamp":1678778943,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646673646673)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3500,"kind":{"data":{"args":["0x627463","0x73646673646673"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400909b3b63ac083b69d76f08df2a013f299a36599500000000000000060000000000000dac0001166ff2cc48485fa02cf475774a094a18f214eb380cce47a1c951721c4e5805e7269b777e0e1275ee0c968bbbda36890f10003fd9b6c033c1eb99731cc067e101030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773646673646673","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ae804686173680200000000086d657461646174610c00000004046e616d65020000000773646673646673096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a909b3b63ac083b69d76f08df2a013f299a365995","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST289PEV3NG43PTEQDW4DYAG17WMSMDJSJQ8P2KND","success":true},"operations":[],"transaction_identifier":{"hash":"0x55ade28b0835137447a71beb698cb2b026fb0b1820ea024fc0f05e2658329573"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x13c2fbaad398b91f1cea38b5ca28d8ae0a10459646609afcaa494eb885375766","index":100325},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000043ff0820d00ad264876d4343ffd982a215ba7d64c432af49be6935d0","index":2424345},"confirm_microblock_identifier":{"hash":"0x3fd21265f04d43a988ac9ca09c565dfa69d759a22aa232fb49a94984e4df2b6e","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":144,"stacks_block_hash":"0xebb884cafb77cf8a2ac291b9a84c8b8a6a4e720a531c871a03dddb8b8c124286"},"parent_block_identifier":{"hash":"0xbbb5635a64ca142e5cfffa6a91c7a052ee694a51e286e45e419b651998254895","index":100324},"timestamp":1678782064,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f777465737437)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f777465737437"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":21,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b00000000000000150000000000000bb8000180a538f5377054ce7e4467f56e7d7a603c664d2ac5350bf52223972d792a1f900fb1b03307f415c5098d0c5f2df524d35015b1d6a21f680efb956d0a55cf35c3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009666c6f777465737437","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aed04686173680200000000086d657461646174610c00000004046e616d650200000009666c6f777465737437096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x500101c67ea38c238391f2183d5c529faef5c53e007fb28627543cc1674cb25c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5614f5fa76dd0eebfaa05259a3670a355ed893a40c016f9a7d4cd706b658192a","index":100326},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000010fc736bdb434033867cf86dcc2232acb1d68486e70b4f0d45ea","index":2424346},"confirm_microblock_identifier":{"hash":"0xd98ffb3d08678a906d5587db165a0d2c8ac883e7dfb821d0a0998831213af25b","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":145,"stacks_block_hash":"0x9784c434b8c7a51146a7d4e57b98b8c3c4e4d8fcbec5a94664b333d19dd1357e"},"parent_block_identifier":{"hash":"0x13c2fbaad398b91f1cea38b5ca28d8ae0a10459646609afcaa494eb885375766","index":100325},"timestamp":1678783279,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f777465737435)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f777465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400b0bec85a220d180680d3762dfdf2f4cd5cd0da1700000000000000040000000000000bb80000bd7b578a20b8c46488828207c7229916573aee113fb978a5d65d3d06ea61143d117ae2b905efcc129aab470751a01d1c90673de9b3dcd19b5fbaf46c9465daed030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009666c6f777465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000aee04686173680200000000086d657461646174610c00000004046e616d650200000009666c6f777465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab0bec85a220d180680d3762dfdf2f4cd5cd0da17","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2RBXJ2T486HG1M0TDV2VZFJYK6NSM6T2WD5FP7G","success":true},"operations":[],"transaction_identifier":{"hash":"0x5a6d8ea5d4440ef4c119a5a9fc6bc894947d47bd5fe44b535cfdee6210e68025"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8cf59c5e12ca2ae41d2ad7f1bb0b3365ba872a9ebb342e1afb85ad98a3861f25","index":100328},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000460d719038d440c315a0dff8a9cacfcf658f28937a33d4dd8d24","index":2424348},"confirm_microblock_identifier":{"hash":"0xcf779eb1aa1b5d1afac9cc3964d4e8037fce32602379f336634ef054db9ff61d","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":147,"stacks_block_hash":"0xe632f5a763783803fca93bb29c5183f6c70b7cd91e4910f714f8fb387af0597b"},"parent_block_identifier":{"hash":"0xb18916daecee17a7d202a82e98871db4d919ee6313d42a46534b7db05a1b00d1","index":100327},"timestamp":1678784984,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6975796674647273617863686a)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x6975796674647273617863686a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":24,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b00000000000000180000000000000bb80001ee0293463f231bc3ef7936e29951706f3eb13bb4d86f46a2659123916e6fdf5c1bb94bcf9c3a5d9f5c7210606fb3ae2d5947ad6824ed21fbdfad828c44d1449e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d6975796674647273617863686a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000af204686173680200000000086d657461646174610c00000004046e616d65020000000d6975796674647273617863686a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x977b8c3029cc7ae82183c0538974054c015b1c64bff76ccb544525882977852e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9117fc82b1100bc869be65ee5a8af6b9b98e113f8ab79a944dedf87dc2daa4c3","index":100331},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000011c5ecfe3e780a5178d462b918157e7bf6e6ca8f11ec6ac82","index":2424354},"confirm_microblock_identifier":{"hash":"0x48d952c76f636d4944e46de5ef133d5c293453a3bfdcabf5416e1861b0045cec","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":153,"stacks_block_hash":"0x971fbd9b33a64809927ac3f451b69a39993aecb103338b71a2640035a325fd78"},"parent_block_identifier":{"hash":"0x7607cc3b288aedf8455cfd0e290669f2201979a9a84f07dd24076bb3923c905d","index":100330},"timestamp":1678788761,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6673676867)","execution_cost":{"read_count":16,"read_length":43995,"runtime":166750,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6673676867"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":13},"proof":null,"raw_tx":"0x80800000000400d193371e464a7f06e56a152b1bcf20591ee25fbd00000000000000000000000000000bb800018d4fe6c592f3268df47c954e8b05be93a77d2c7ea03eef60f1cf67a8fc65182d04ff6aadfc5f6709a847d738a23a91ec96d1dcde3bc4351572a43307553bf567030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056673676867","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000af504686173680200000000086d657461646174610c00000004046e616d6502000000056673676867096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad193371e464a7f06e56a152b1bcf20591ee25fbd","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST38S6DRY8S57Y1Q5D8AJP6YF41CHXRJZQMKE5RPG","success":true},"operations":[],"transaction_identifier":{"hash":"0x375e1261658c1c68002e823c8095fa21c3d837eeff006cfbdb3734dcf698c080"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xac782f5eaf02a6ff002394dbad976bb481e740fc807389ef0b7e927b27698ba0","index":100337},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000ce8151dac34e39191b4956556bb09058f7b9c7dbdff4a0e8d6ff","index":2424364},"confirm_microblock_identifier":{"hash":"0xbd4f009e61835e428438afaeb56250aa152c6499745a4f267f7a865fb2404add","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":163,"stacks_block_hash":"0x379f8b0764769e21ceda4a72e951d64c6282d77e2629fd8d88b7bae9ae152846"},"parent_block_identifier":{"hash":"0xa2808fe2997514ed36b383de3918ed2bbf9879c23742b490b2b793fe1ae867fc","index":100336},"timestamp":1678795079,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d66726f6e7472756e6e696e672d31)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167464,"write_count":2,"write_length":170},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d66726f6e7472756e6e696e672d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400444405205b939a0230313fde340e79246068346f00000000000000010000000000000bb8000146e528d05e5d8957bbd1c528dd75f07dbacc6f5216bbafed7aae3d7398ccabf349d95aec10cafe4fe5ec3333d17349c9e04b7a8bfe8715d650932cb112cd3ec9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000013312d74782d66726f6e7472756e6e696e672d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000afa04686173680200000000086d657461646174610c00000004046e616d650200000013312d74782d66726f6e7472756e6e696e672d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a444405205b939a0230313fde340e79246068346f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1248190BE9SM0HG64ZXWD0EF4J60T1MDWQWZ3EH","success":true},"operations":[],"transaction_identifier":{"hash":"0xdfb2c3f905b69e8a906ac521a4f90da8f6cacdc206746caf416f51b890c6806b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0b076fbe31d45758ea1f055b7dac4d63d4fb4cbebe022c6ca9b33e7f39ae8145","index":100345},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000067c0bf5fb69284da5f12787bf8b15f80a9908fe7e8d5cbc15a500342","index":2424380},"confirm_microblock_identifier":{"hash":"0xeb072722fc12916cd0082c85ec9baad33b4f2f742ed162970be8b62539601926","index":15},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":179,"stacks_block_hash":"0x99afb006e55d1b0e908fdb9686ccfdb76211adc3ace136f042f2fad417b21101"},"parent_block_identifier":{"hash":"0x7f4fe234d3a31018f0486cabcb5f8bc6e16291035da297045144565bffa1c20a","index":100344},"timestamp":1678800663,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d66726f6e7472756e6e696e67)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167362,"write_count":2,"write_length":168},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d66726f6e7472756e6e696e67"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":12},"proof":null,"raw_tx":"0x80800000000400852736929dfe2f4e7bbed70081beadb13c83c36900000000000000010000000000000bb80001a708cfd14b9a144187738860b30b275203b0f3cce1fc7cae5ce730d7be9b9cb648fd90ca4e2ddb9a1a6d4dc2a9f3257f2241ba2197b806c6dcf3df5a479636f3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000011312d74782d66726f6e7472756e6e696e67","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000afd04686173680200000000086d657461646174610c00000004046e616d650200000011312d74782d66726f6e7472756e6e696e67096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a852736929dfe2f4e7bbed70081beadb13c83c369","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST22JEDMJKQZ2YKKVQVBG10DYNPRKS0Y3D5HVK5PH","success":true},"operations":[],"transaction_identifier":{"hash":"0x3b2921dcce6559190891b722a8b0bb7bb28f1a997003a288fe10d6b4e510f6b2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9ae9e0af6d5195b2351128ad841b25dd0b037dfce49c2908fa761e03589fe023","index":100354},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000002d079052be1ab6af4b6aa7c8a7f9919cfe84c64acaa634f47","index":2424391},"confirm_microblock_identifier":{"hash":"0x68a7376ee9c4e8e3c1f5d524c8e93fbfe941244e9908a7cad806d98cc7777222","index":4},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":190,"stacks_block_hash":"0x6cafe3602b161e9ac700dac756b74d186b3c6f933876d2396fe3b69459f0b9f0"},"parent_block_identifier":{"hash":"0x14b20dd0a035c427644d13d8b9dc80a6967df96a935fabae0a97b792cda25e0c","index":100353},"timestamp":1678810905,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a686766647377)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x6b6a686766647377"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400b0bec85a220d180680d3762dfdf2f4cd5cd0da1700000000000000090000000000000bb80000a76a20186fdc440e6211d8601a740685b4cffb3c77ff9c9f4678e50e511e6e182f0b781117cdf81528d5ea8365dc45c70914392a3829aa7a5faa00e9a10b98a4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086b6a686766647377","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b0004686173680200000000086d657461646174610c00000004046e616d6502000000086b6a686766647377096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ab0bec85a220d180680d3762dfdf2f4cd5cd0da17","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2RBXJ2T486HG1M0TDV2VZFJYK6NSM6T2WD5FP7G","success":true},"operations":[],"transaction_identifier":{"hash":"0x35a85f134ed22e604363c9b69e16961c6abf83c111ba8a27f587162680eec0e4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x4147a81f76cf85c17bd622583273d23fb93c78b07c36e64d102ba91a37c3ff4d","index":100360},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000056a86309849b324c28115bb0efef05cb62d0ca848257b4421","index":2424404},"confirm_microblock_identifier":{"hash":"0xa960b8b4f2d0fa3b78f6254d06723b09cd17c379cc95aeea8b27c468cb3a589d","index":9},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":203,"stacks_block_hash":"0x36bc9380a9ee9d8874fbc9fc2272085c01c9a4e118a50fe0aee795348254054a"},"parent_block_identifier":{"hash":"0x68e51081cba9c52536ae2e153260b52febb59acfed7535493af3f8eddeed6443","index":100359},"timestamp":1678818514,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616466737662)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":3500,"kind":{"data":{"args":["0x627463","0x616466737662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400e037f847bd8fef429835622061cf707e903fa4c900000000000000000000000000000dac0000ef0faad964464bc7478af984f884bbd192fcc764de99441fe18a0fd18cb9a4210799de5105ae15a02b0745b0196e06558edd9d906505f986c4145814ca3a38b1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006616466737662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b0204686173680200000000086d657461646174610c00000004046e616d650200000006616466737662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ae037f847bd8fef429835622061cf707e903fa4c9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3G3FY27QP7YYGMR6NH20REFE1Z90FX4S72JTD3X","success":true},"operations":[],"transaction_identifier":{"hash":"0xa59db6fe9a28a17faf0ac62f2a25c6289746a50085b2e643f726cfe81dffe5c6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x2887d588348593d153a6bee21780ac736ebae18e207e2a98581729b2eade64c7","index":100361},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001470d579c2d5c22de32082e7bd7c564ab3739e9807bda4e1ed","index":2424408},"confirm_microblock_identifier":{"hash":"0xbef9eac7647c650ea100aac6c8630a38703c54a689f1608c2480be2c2c9fb3ec","index":7},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":207,"stacks_block_hash":"0x380a7a8cafdfd801f6b98dd5e4c2b5651f8d771f2600997ac84da68c65640a6b"},"parent_block_identifier":{"hash":"0x4147a81f76cf85c17bd622583273d23fb93c78b07c36e64d102ba91a37c3ff4d","index":100360},"timestamp":1678821035,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f6e652d74782d6572726f72)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6f6e652d74782d6572726f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400444405205b939a0230313fde340e79246068346f00000000000000030000000000000bb80001dace2abb8062a71121e5c01d31690efe90c9a344809adc47ad2252c5fc80da0e4ddd59c1c3613af15f47fc8a05c4c61163ac5ae852285996419c4045c44e3419030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6f6e652d74782d6572726f72","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b0404686173680200000000086d657461646174610c00000004046e616d65020000000c6f6e652d74782d6572726f72096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a444405205b939a0230313fde340e79246068346f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1248190BE9SM0HG64ZXWD0EF4J60T1MDWQWZ3EH","success":true},"operations":[],"transaction_identifier":{"hash":"0xcebf7f75482f052f2cb48e95c95a680b3fda9ceda4457d2e6a1075af52c266e0"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x53a0bcfa5dabf75570c31fab594366d0f73fb3f47cecf523cacf4d24679f6b2f","index":100418},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001d32161ab4a0c2bb22ff2db22dcd7a1f1b6f181e321db091c9","index":2424485},"confirm_microblock_identifier":{"hash":"0x10fff6ad740e78720005dcb4c78907363d8dc3bb200e157fe7ec300f0ab3923c","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":284,"stacks_block_hash":"0x2a0a4b48c5a37335cdf392c17ac359dc9f1ee5fdda5d5da2bfd6fe748708870e"},"parent_block_identifier":{"hash":"0x743c59b512fb4b3bd25fe0d1f9a185a2322c96d282100ed582733a8b169914a7","index":100417},"timestamp":1678879192,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f777465737432)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f777465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":39,"position":{"index":3},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a00000000000000270000000000000bb8000148ec86b13819cd146876cdc45a5789ee43d7848f9da2b4c0e0d1bba8b320cdab69fe771c230d519568dfcfcb3e8774121419a40699e26bfc791e7ac41f28f173030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009666c6f777465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b0d04686173680200000000086d657461646174610c00000004046e616d650200000009666c6f777465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x9976aa8cfaba0018cfe747e256a2a8614f392673c3982cba3112ea0a4c73dd56"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0ab8bba6f25eb708ada5af0e5c4bfe802277c986c4f30c3cb9924fde331b5b8d","index":100456},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000020bc22d646316579d9709a29a5211c0655e824d1d5895ad8a3","index":2424539},"confirm_microblock_identifier":{"hash":"0xee148147d2afcccf7e22539a6cfcaa599f740d379f56754e323defdfa71c14af","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":338,"stacks_block_hash":"0x364c1fd78f39171c26389a46419237bdd4d55e2bafc5a51a6ac73af7a4870d06"},"parent_block_identifier":{"hash":"0x1f232fd56ef310902e8f8712998df953328cd007e964ab7d9ba31e40da68974a","index":100455},"timestamp":1678911162,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66696e642d74782d6572726f722d31)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":3000,"kind":{"data":{"args":["0x627463","0x66696e642d74782d6572726f722d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040019544bb51de02f1155b412d901bd9aa8596c559f00000000000000020000000000000bb80000fd89394ecf605b1aa842abd71ad1a5888f721ad6e16b80d99e2c354563b8977f6af8c7ff69559537c89cbfa23eb3f8a1339ecc80327e208d6f85d589475bfb22030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f66696e642d74782d6572726f722d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1504686173680200000000086d657461646174610c00000004046e616d65020000000f66696e642d74782d6572726f722d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a19544bb51de02f1155b412d901bd9aa8596c559f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STCN8JXN3QG2Y4ANPG9DJ0DXKAM5JV2NKXSKYV9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x5929dbd478130da2093d01652b709bb7bca1a7e9c91dda5d33af2f51a491bfb6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9795645ebe4ef3965926d08b4f268115a8cd8c573de0b62f517707736223572b","index":100458},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000012bf986014adf520966b82dfd14377224416a5b0e2be10d5d1","index":2424542},"confirm_microblock_identifier":{"hash":"0xbff7fa8e591de4f65668b5244843d43ce7d43cced72c78f22d8c1d8961633507","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":341,"stacks_block_hash":"0x169ccd1a001cc530d0c1296fa780a01ad42bbb7edd24cb6c06543cf57b1d39bc"},"parent_block_identifier":{"hash":"0x684ca184a829f43484d6f97a57a523a4c64c18ceed090c06089772ef843e365d","index":100457},"timestamp":1678912545,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66696e642d74782d6572726f72)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x66696e642d74782d6572726f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400444405205b939a0230313fde340e79246068346f00000000000000060000000000000bb800008accc2c8d4dcd229dfccdec230badb461f53b550ecc59ab5536ed4874fe95e1b1199a6a507cc4184f0ecdebf15676a2a18f6c6d05584fec54d43b017599aa449030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d66696e642d74782d6572726f72","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1b04686173680200000000086d657461646174610c00000004046e616d65020000000d66696e642d74782d6572726f72096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a444405205b939a0230313fde340e79246068346f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1248190BE9SM0HG64ZXWD0EF4J60T1MDWQWZ3EH","success":true},"operations":[],"transaction_identifier":{"hash":"0xab3455cab62b68bba346429b6a9c3624c81181ccd702d4483847268de5c0ca40"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d72656769737465722d6661696c6564)","execution_cost":{"read_count":16,"read_length":44040,"runtime":167515,"write_count":2,"write_length":171},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d72656769737465722d6661696c6564"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400225700e5544339411fecd77be4aae305e146e15100000000000000010000000000000bb80001608ee06bc71ff70f7ff13b203f3dc4f2e3ae8a2ef37f12d21ce94836fcf820150ff054cf0ea67a8c0676a360b9bfb4b2374292ae013ca8216281bbf608f212e1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000014312d74782d72656769737465722d6661696c6564","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1c04686173680200000000086d657461646174610c00000004046e616d650200000014312d74782d72656769737465722d6661696c6564096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a225700e5544339411fecd77be4aae305e146e151","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH5E075AH1KJG8ZXKBQQS5AWC2Y2HQ1A550JWV2","success":true},"operations":[],"transaction_identifier":{"hash":"0xa4c1d092d43d3472811da9d039f91959c2d2eba4399b434e30cd162a938f408c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x322d74782d7365636f6e64)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x322d74782d7365636f6e64"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004006e32e39d293009c471010cd9dada98ecaed4000d00000000000000060000000000000bb800011563d8700b1addfc66879db8643e64033774334fcf02b1c05aad1ac42148e1286dee25cc3184b9b5b5ddaab12e2769b2a72971b48b6b1f3c37019f3182fd42ba030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b322d74782d7365636f6e64","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1604686173680200000000086d657461646174610c00000004046e616d65020000000b322d74782d7365636f6e64096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6e32e39d293009c471010cd9dada98ecaed4000d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1Q35RWX54R0KH3H046DKPPTK3PAXN001QENC5FS","success":true},"operations":[],"transaction_identifier":{"hash":"0x5f7d6e5b9ee7d583e7635dac18f21afdee2e8db5715876134038577cc677977c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x322d74782d6669727374)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x322d74782d6669727374"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":6},"proof":null,"raw_tx":"0x8080000000040015748d4fab3bd14c369030378468b5af3b6ed58f00000000000000020000000000000bb8000008c9049d0dd3c70fe370458885b5859c4c54f0ea1a3b07b21b30fd7e31b7115b604a4d857b04f31e9a14e5935b8bf836bcb112e9ac32f5ba8861b96c90fb04d6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a322d74782d6669727374","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1704686173680200000000086d657461646174610c00000004046e616d65020000000a322d74782d6669727374096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a15748d4fab3bd14c369030378468b5af3b6ed58f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STAQ93AFNCXX2K1PJ0R3F138PPQKPVPNHYDKH08A","success":true},"operations":[],"transaction_identifier":{"hash":"0x411ba341610ba66ea221624cf4234c2628d55a3a7c85cce4632b519249325e46"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636c61696d2d6572726f72)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x636c61696d2d6572726f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400824aa968bb0fd20d502a5dd6e8b1828124acc70500000000000000030000000000000bb800012531591ca309f4b4f69f168e2135482e89cc4969c0e8741f532d941de24c9f543b2cca3739e485da8f13df8596240101594fd74075b06ff6b620fc98bc709bc5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b636c61696d2d6572726f72","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1804686173680200000000086d657461646174610c00000004046e616d65020000000b636c61696d2d6572726f72096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a824aa968bb0fd20d502a5dd6e8b1828124acc705","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST214NAB8QC7X43AG59EXDT5HGA0J9B670PN9S5GX","success":true},"operations":[],"transaction_identifier":{"hash":"0xcfd783b92f3845047aece30dd3d0726cac1c55b911f0cbc2757c7e09f81f49e8"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x636c61696d2d6572726f72)","execution_cost":{"read_count":12,"read_length":43984,"runtime":122683,"write_count":0,"write_length":0},"fee":3000,"kind":{"data":{"args":["0x627463","0x636c61696d2d6572726f72"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":8},"proof":null,"raw_tx":"0x80800000000400824aa968bb0fd20d502a5dd6e8b1828124acc70500000000000000040000000000000bb80000a956853b234433e8679d36383c6405e9b6041606817e865b8fc136785abfe1690d827bfd65bdeaeb9369fb62b8564f84fb39dfa74ba4e4822f82d38d80a1dd42030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b636c61696d2d6572726f72","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST214NAB8QC7X43AG59EXDT5HGA0J9B670PN9S5GX","success":false},"operations":[],"transaction_identifier":{"hash":"0xdc26459d26e9bc815cc1c79fbbf71058f84dde8c595cd0c7fa2db6acee3f8144"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d3134)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d3134"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":9},"proof":null,"raw_tx":"0x8080000000040027212eae634e8dec6d02956b344a236eef38fb8600000000000000040000000000000bb80000f5b2c7ca54f93b509b28cd65827b4ce9712bea04eeb5698a1fd1c0d682fa695c4af620d02613a446a563667029ecb5a17af3df6a23259c5c9f6b141fcbdb19c1030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007312d74782d3134","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b1904686173680200000000086d657461646174610c00000004046e616d650200000007312d74782d3134096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a27212eae634e8dec6d02956b344a236eef38fb86","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STKJ2BNECD78VV3D0AAPPD2A4DQEYE7VGR57QFJ6","success":true},"operations":[],"transaction_identifier":{"hash":"0x717a88aeee57eab9ac5cfb257ef708f8d3c5d2f23ddfa61182a5203b91f95afb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x768cee95db4adf4226b862461f04d27d79611f1304db680d1d48c75a27372c4a","index":100459},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000067dce8c79cc704839aff0849c0b9d56ac3d59b14663b9701d90b","index":2424551},"confirm_microblock_identifier":{"hash":"0x5af69b60113663e4af9279c340a9216e31db26094efa29ff5eed9a57535bde30","index":7},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":350,"stacks_block_hash":"0x19ce89b9af072044478b7c22ac61d47b487ef17c4ec111d8e5c2fe85a713c431"},"parent_block_identifier":{"hash":"0x9795645ebe4ef3965926d08b4f268115a8cd8c573de0b62f517707736223572b","index":100458},"timestamp":1678914074,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6368616e67652d706c616e2d627574746f6e)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167413,"write_count":2,"write_length":169},"fee":3000,"kind":{"data":{"args":["0x627463","0x6368616e67652d706c616e2d627574746f6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040019544bb51de02f1155b412d901bd9aa8596c559f00000000000000040000000000000bb8000083a4b8ae78048e829f2c179872f776746c79b39d00cf33f67cd7075864809c3e246ee5058af6a7480cda6b67e310156f5ffaf89bbd0b9b4adefe5b6d78ab6f50030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000126368616e67652d706c616e2d627574746f6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2004686173680200000000086d657461646174610c00000004046e616d6502000000126368616e67652d706c616e2d627574746f6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a19544bb51de02f1155b412d901bd9aa8596c559f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STCN8JXN3QG2Y4ANPG9DJ0DXKAM5JV2NKXSKYV9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x9182dca75c82b58b7cd8710067c18ac8fa3b887402f3728f41cad6ddd6fb5f6c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x5e066e7195586f6e8df59119054c13d80dedefb5b26702879cb401b185e3b591","index":100460},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000002877997bc6867c0cd2dd88b418c87aa0f41b618d3644b9e9c755","index":2424555},"confirm_microblock_identifier":{"hash":"0x7e165ee5e6730aeb384379ee55f4f9d73065113acd2756696d8bb02935fe1e95","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":354,"stacks_block_hash":"0x9ce9de24fc489982adebe7d828fed622b6b3339290a2b421d3596c00badbbc8e"},"parent_block_identifier":{"hash":"0x768cee95db4adf4226b862461f04d27d79611f1304db680d1d48c75a27372c4a","index":100459},"timestamp":1678918979,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7272727272)","execution_cost":{"read_count":16,"read_length":43995,"runtime":166750,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x7272727272"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":3,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400225700e5544339411fecd77be4aae305e146e15100000000000000030000000000000bb800005836c31082fe0e746142406db064bda660b2217de42df519e117295d391a3e48697a6229c5147591dd7497a3cba46fc9779302b91e28c77cb8ab0c4a7db61887030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000057272727272","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2304686173680200000000086d657461646174610c00000004046e616d6502000000057272727272096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a225700e5544339411fecd77be4aae305e146e151","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH5E075AH1KJG8ZXKBQQS5AWC2Y2HQ1A550JWV2","success":true},"operations":[],"transaction_identifier":{"hash":"0xd2b2723872839af681f9c34ebbcbfe88d1a51fb91ee22cf87c83758a04b90016"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x926f7207f6714e47a0b0e24c1a01eb87a2a5e9a505e8c86620de5342bb8e4f48","index":100489},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000003b49379aac3373f92500d25eafb7f65f34b27d6aef2c2efd5","index":2424587},"confirm_microblock_identifier":{"hash":"0x1f47fa0945eae58b352b1b22db75408a0dc313ba0eea5c440f317079c61fb927","index":1},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":386,"stacks_block_hash":"0xec190f917235c09016ceadb459bc46d37541928af52cec864c743d1f56969c0e"},"parent_block_identifier":{"hash":"0x4deb432ce58598c99672bc61803ce44adf22c7646defc29a3ad860a0aebc155e","index":100488},"timestamp":1678944565,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616e616c7974696373)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x616e616c7974696373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040019544bb51de02f1155b412d901bd9aa8596c559f00000000000000070000000000000bb800005ed829251d240b76461b437ab132d084544846b53b1e7ec217e93d5c795bfb50574c211702b223d680a6869e94f52233e379b4e2353df98700b5583411e32ff6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009616e616c7974696373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2704686173680200000000086d657461646174610c00000004046e616d650200000009616e616c7974696373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a19544bb51de02f1155b412d901bd9aa8596c559f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STCN8JXN3QG2Y4ANPG9DJ0DXKAM5JV2NKXSKYV9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x6b57455b5eb009369f630beb76c3e74150e8bee5edf8145994c9d15149215a68"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6173737474)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c6173737474"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400bc436bc123036a89a3111b21708d0d16e90955ef00000000000000010000000000000bb800003bea08573be6fb7ffd3c02f0e0378c283c3c9f6ae4c1cb29a981e6f3fa987dc64cd19ebe32b8cfb845476e8ef2bdfdfe4af960ee23b00df0730ca283973ee6a9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000066c6173737474","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2804686173680200000000086d657461646174610c00000004046e616d6502000000066c6173737474096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051abc436bc123036a89a3111b21708d0d16e90955ef","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2Y46TY14C1PN2D324DJ2W4D1MBEJ2ANXW80VHB1","success":true},"operations":[],"transaction_identifier":{"hash":"0x9059ad704a758de15c7308e85f43335fa481f4c0cc832176c7d195b37a7f7047"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb0451303997d2ca746aa964b1fbe8d55a47ef2cc8fba213521838bf9f1d84f7d","index":100496},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000e1797d014e89ba86639858837b4e7b1c13869156041062eec8c8","index":2424595},"confirm_microblock_identifier":{"hash":"0x872e426bc297a97bf6a0d4dd60a16559872300df398556039b9cd17a72401b91","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":394,"stacks_block_hash":"0x4ec21da64dc9a9ba4030dca423f31484f5b8d317b5e7bb2438181103cd9b36f4"},"parent_block_identifier":{"hash":"0xb1f74c17bc3e25f4556fa37fd019c87dd064e4bcddd2743f1dc876910913ba6d","index":100495},"timestamp":1678948668,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d616e616c7974696373)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x312d74782d616e616c7974696373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400225700e5544339411fecd77be4aae305e146e15100000000000000050000000000000bb8000123de2fa44547d074194a9a6070d28aaf5c05abf8cd1033292eddcd892c4ef20b21478b1ecbb2d09ca77783054872ecd732ea7107af7faaa6594ca2268159ae2f030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e312d74782d616e616c7974696373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2a04686173680200000000086d657461646174610c00000004046e616d65020000000e312d74782d616e616c7974696373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a225700e5544339411fecd77be4aae305e146e151","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STH5E075AH1KJG8ZXKBQQS5AWC2Y2HQ1A550JWV2","success":true},"operations":[],"transaction_identifier":{"hash":"0x822a2bd4cbc39437c827702f19ee8d649d4718ea014a29091034223cb314a134"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62746e6e2d7662746e6e)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x62746e6e2d7662746e6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400444405205b939a0230313fde340e79246068346f00000000000000090000000000000bb80001c370c72972d9db4a4667d5c311eb7c6b927956dd082eeca39a82618605f7eece24d8e6e449913293f3a839c1b434020e375c9042216eee3e5ad9d671f3678a71030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a62746e6e2d7662746e6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2b04686173680200000000086d657461646174610c00000004046e616d65020000000a62746e6e2d7662746e6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a444405205b939a0230313fde340e79246068346f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1248190BE9SM0HG64ZXWD0EF4J60T1MDWQWZ3EH","success":true},"operations":[],"transaction_identifier":{"hash":"0x44f85683038dbf6a9323b7507dc5f73be814b6f3033289e7b913a7f2e857cf9c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6675636b2d6974)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6675636b2d6974"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004006e32e39d293009c471010cd9dada98ecaed4000d00000000000000080000000000000bb800013e0615b473b388af43dbb654703e40f47524631e8e010b856d90d58c457e52267e3d70d5338a54c55af010019df71b387fa779890cf9879e0f00d8a55a8ac626030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076675636b2d6974","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2c04686173680200000000086d657461646174610c00000004046e616d6502000000076675636b2d6974096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6e32e39d293009c471010cd9dada98ecaed4000d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1Q35RWX54R0KH3H046DKPPTK3PAXN001QENC5FS","success":true},"operations":[],"transaction_identifier":{"hash":"0x4dc6bd6ba080e4ad63b24a16398b6c0865b51acef60ee3c29ed4e61e2972b401"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcd3fdb3c66e01378465bdc06a7b58bfcb8903a43efce282aec11d5b541e154ba","index":100497},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000015cadfcbae38fde4ca91b9252541ad9e2a17b110814bb451fb","index":2424597},"confirm_microblock_identifier":{"hash":"0x3132f9d61ab83dc908f44d0734c869f8df4e1b022b5feaee331ca74cba3afde0","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":396,"stacks_block_hash":"0xe7cb4e2d3dedcc89ef6421d38d68588794a2bf77887386b25238ad51a48dc705"},"parent_block_identifier":{"hash":"0xb0451303997d2ca746aa964b1fbe8d55a47ef2cc8fba213521838bf9f1d84f7d","index":100496},"timestamp":1678949905,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x66757563636b6b6b6b6b)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3000,"kind":{"data":{"args":["0x627463","0x66757563636b6b6b6b6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040027212eae634e8dec6d02956b344a236eef38fb8600000000000000060000000000000bb80000eeffe6e59ade44662eb7c039538808188078c6f5f4a7e236a746def54eb8cd9b50d3202558aacf017e62c68f0c226641366e6d25a4bbd7137e6eb4cd01668d35030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a66757563636b6b6b6b6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2d04686173680200000000086d657461646174610c00000004046e616d65020000000a66757563636b6b6b6b6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a27212eae634e8dec6d02956b344a236eef38fb86","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STKJ2BNECD78VV3D0AAPPD2A4DQEYE7VGR57QFJ6","success":true},"operations":[],"transaction_identifier":{"hash":"0xb51701920284992214e2a29cec2dc807b80162850f8d7a6bcee29b19e2fe2f62"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265706c616365642d7478)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x7265706c616365642d7478"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":89,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040054bd886f037ac729ebf2e2aea742ad0a1a3029b900000000000000590000000000000bb80001b10e42c07539a8f4d5368f06f0da86fef78da1cbf149b6bc8db0079502a6a9e358f6616ee4717837f0824378e768936d0238461b924796abb18ffea34732c2a8030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b7265706c616365642d7478","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b2e04686173680200000000086d657461646174610c00000004046e616d65020000000b7265706c616365642d7478096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a54bd886f037ac729ebf2e2aea742ad0a1a3029b9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ABV23F0DXCEAFBYBHAX9T2NM51MC19Q4K6JDY9","success":true},"operations":[],"transaction_identifier":{"hash":"0x7900616cdfc4cebb7068acfa085d42c0cd65c23098cc5b5a5d3b224cd4677bc2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x20bfaa332ef36e636f452587f99e825344bb5fa64a500a7e1c9aa8b910456baa","index":100502},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000cc02470fc898204cd643196121f391b632cacc4b421e8a979b4","index":2424602},"confirm_microblock_identifier":{"hash":"0x4a5875c0afd44ba2d78572d5ac996b295e0fcb8a18a12fa8b644d658be3508db","index":1},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":401,"stacks_block_hash":"0x9d95122d44f6e618bae8f8a4eaed9423d5150cc1b8808643a5dced42fc1559ae"},"parent_block_identifier":{"hash":"0x7f3f38ad0ca0aa2a209a735a3f91c951b43df31c0928ec445ee35f0a8318db03","index":100501},"timestamp":1678952425,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6675636b2d69742d32)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x6675636b2d69742d32"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":91,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040054bd886f037ac729ebf2e2aea742ad0a1a3029b9000000000000005b0000000000000bb80000a5d2b47b2dcec8987ccad8d2489ecd60daa0f5783e6a7cc7150978fbe23db91550fcb4a0c8d9968679e0492da0d2414ad41e1517265f4792bb0001e4c868f7f6030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000096675636b2d69742d32","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b3204686173680200000000086d657461646174610c00000004046e616d6502000000096675636b2d69742d32096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a54bd886f037ac729ebf2e2aea742ad0a1a3029b9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1ABV23F0DXCEAFBYBHAX9T2NM51MC19Q4K6JDY9","success":true},"operations":[],"transaction_identifier":{"hash":"0x8c25e802c4db64a892729ca88a8559fd776f8524181ba5cfebf4c5c45e4cb907"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc2b2afc4ff71446a61b6006cc718201e50c062af9a6dca048ba54ab4527b5880","index":100504},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000e3cd137a675e62772c9187a8e5dc5676fab7cb1fcff6421db","index":2424604},"confirm_microblock_identifier":{"hash":"0x2114fb8357761c717a2db6268fe2fddde2be07430446a02a26a1afc876fb8cb3","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":403,"stacks_block_hash":"0x440d88064210b47cc120aa61a3eb156be5c873732602f0db5c280de7f11f4fce"},"parent_block_identifier":{"hash":"0x434d627f8183ad20a94e4865d5bf931e0c30ba4ff0d6208249ee5f22d061cc02","index":100503},"timestamp":1678954846,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c797463732d31)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c797463732d31"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400bc436bc123036a89a3111b21708d0d16e90955ef00000000000000040000000000000bb8000177fb52ea5b130a2b5ac954f9c4e575ea1164a7c706419a19383fcd68028a373d78eb4d35fb936188cff4eeb119731426aff82be6fc96845a721eadf46b8d6078030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000076c797463732d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b3304686173680200000000086d657461646174610c00000004046e616d6502000000076c797463732d31096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051abc436bc123036a89a3111b21708d0d16e90955ef","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2Y46TY14C1PN2D324DJ2W4D1MBEJ2ANXW80VHB1","success":true},"operations":[],"transaction_identifier":{"hash":"0xa76ef37036df32985b65e7c3ac6f16a6a35e83e09a93aa21958f2de8d8fc602d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xcd4998108ec73779de7b870ff40d6718bed96e77966224d4ac2f7fc636fd2686","index":100506},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000728e4566861e26f1d88a5a61ca0764b2b8835b09b3f622f037a","index":2424606},"confirm_microblock_identifier":{"hash":"0x600e37a7bdb70014089b0502ccf68a8fd28775ed26c8c3edd0d651b7540ca6cb","index":1},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":405,"stacks_block_hash":"0x581eef47e64de24da94cc0ef5268922a840789c79b0bc32017b4e19ca4492484"},"parent_block_identifier":{"hash":"0xf0ec7899204779425ee537d8b424832d9f7aa50da419d04226a72a716cc966f5","index":100505},"timestamp":1678955807,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374696e672d646576)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x74657374696e672d646576"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ba08204032084fb7528ee740404e676b2e093c9900000000000000060000000000000bb80001eda00bb8c583a4d7b4544e127b3fad15b1f7c1221586a6b055c75cd71c4bd98873e1cf7fc3daa364af052e1f54bb55490addc3a1a8c7eda53bc0eadd63cabc1a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b74657374696e672d646576","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b3404686173680200000000086d657461646174610c00000004046e616d65020000000b74657374696e672d646576096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aba08204032084fb7528ee740404e676b2e093c99","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2X0G8206844ZDTJHVKM0G2ECXNJW29WK563N445","success":true},"operations":[],"transaction_identifier":{"hash":"0x601bdd2dffdb7eeea800fa8bd337f62eef3484026eb19df23f6206ee1987322b"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb15403852e9bc6525fe358ed008f489d43c70fd65ae138edab714859b07c7119","index":100507},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001aff80ab2d34f9d94006599579828efa194f9c1d3d4b10769","index":2424607},"confirm_microblock_identifier":{"hash":"0xbca57969606799ad3c00cf6f375cafc83335eb4466a8fd368c536bf1038dbfb5","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":406,"stacks_block_hash":"0x21f8d84606b6e59c850453d70acfc970d8b6303b95fc3f0e8abc81b0703f82bc"},"parent_block_identifier":{"hash":"0xcd4998108ec73779de7b870ff40d6718bed96e77966224d4ac2f7fc636fd2686","index":100506},"timestamp":1678957017,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x746573742d34)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":3000,"kind":{"data":{"args":["0x627463","0x746573742d34"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400892124f1d97814a899bf876dc3af57aa49a6056000000000000000020000000000000bb8000198bd32ade31ecf7a969b724a608ea5bf81072fcf3ade60180f4555487a3c51017200256669254095297bd4953f5ea21b70b99eac1cdc49267f53ecd3fdddf6ab030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006746573742d34","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b3504686173680200000000086d657461646174610c00000004046e616d650200000006746573742d34096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a892124f1d97814a899bf876dc3af57aa49a60560","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST24J297HV5W19A4SQY3PVGXFAYN4K9G5C07JV0A1","success":true},"operations":[],"transaction_identifier":{"hash":"0x5fb018901b171138b965bf72f00e0ea2cc8687604e201736a62835fde6606cd9"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x365b769753af508b0f4d2c5c082063dadba72490ce5358725973e87f2533f6dc","index":100639},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001d3bbfe16e258e36af4ed487992455c113750a1c0e89c5a71d","index":2424791},"confirm_microblock_identifier":{"hash":"0xd82ee4cceca2ab354f788ef5ecdd0804cdbb1947b471f404c39df6d9471c64b4","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":590,"stacks_block_hash":"0xb0f61f6da9741cce635b539f8f8e8b5645b5402ec64a71e4e964dd44f8c53afa"},"parent_block_identifier":{"hash":"0x3178f258885f029c1f62498aa5b53edab82124f38fa1313134b1191977187375","index":100638},"timestamp":1679042701,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374666c6f77)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x74657374666c6f77"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":42,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a000000000000002a0000000000000bb800006f21d4c63015a31f1b32bf8b49d23ddcf63cf7826e15ce303b5a761ee785676f353d9c9bb19a7970a4bd5447304c34441d3b7207aa10bed8e4c5d8dcbddd8822030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000874657374666c6f77","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b3d04686173680200000000086d657461646174610c00000004046e616d65020000000874657374666c6f77096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0x389b3f6be697c6c9f5d7b502b0a6d0da0f88a3d762d8b0fcd061c5c8dc25e758"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x23e9d8222ae70b54e051271b163386bff3dcfc1863282119e30a3c77558af238","index":100647},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000eb95573912a019cc1dd4e5ba0153f7915b863ad39512df092","index":2424799},"confirm_microblock_identifier":{"hash":"0xd88085f2a83a28f2ed62f4ac0a1665f3ed855eb8e25cebe40e955b2f528b1b9c","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":598,"stacks_block_hash":"0x27f6d1ded2d456e7c5653a871479e4360637d45f5953a26646fbb42a7d3549d8"},"parent_block_identifier":{"hash":"0xf6167a1b6b53a888fe8bd87dc39245bbe4a3c21b391e37158e22db1acbca6d35","index":100646},"timestamp":1679048775,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77666c6f77)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77666c6f77"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":27,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000001b0000000000000bb800004b1ba8a31d229304c1476e358c3895b46ead7d5f203b7a7d22a46b0f8049e8297bc0de20e69fa8f5b81b48caa83cae914ec5e8ecf29015e0d837667bda507edb030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008666c6f77666c6f77","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4004686173680200000000086d657461646174610c00000004046e616d650200000008666c6f77666c6f77096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x25ad691fa2144eca33e222b8afd42f590f0db2ca69685250b6a3c8d5ca2ff73c"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb3c21675e880d4f67211decf9c52824ab2a1e30ecc236a9e17b451e7d1fdbbd0","index":100654},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001ec0f52c6368c747d353426c64289b996b0bfdc4722476eea","index":2424810},"confirm_microblock_identifier":{"hash":"0x6c7def3922b50d256cd9285d42bac7da253950cc5a1fdb51f2d734f8cf4c99c6","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":609,"stacks_block_hash":"0xc7da837b82bd204f01af98621d3909897bcf043ec2b8276bfde0ebeb1cd3052a"},"parent_block_identifier":{"hash":"0x00e69de6b2c35cfb9013bbaf7f25846696602e83e6a11596c8f98e3ccd30304d","index":100653},"timestamp":1679052177,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6577646f6d61696e6e616d65)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":3000,"kind":{"data":{"args":["0x627463","0x6e6577646f6d61696e6e616d65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":30,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000001e0000000000000bb80001bc8fd730cd023484a4824585c322c08ca3505f9cec8e9f284a5cfaef82e63a1671c74bf990b2a139b97d87dbd1925d96d160f51beefaf55007f93daca2185aa9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d6e6577646f6d61696e6e616d65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4304686173680200000000086d657461646174610c00000004046e616d65020000000d6e6577646f6d61696e6e616d65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x05d64933adad84811619d4e1cf9beaaf2ed586b15f1a5a90bb465202bc65e715"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe9a27b2fc0f4cf5385e1173b75d1eec3b28b8fe91b93ed94dcd9ae319c042c92","index":100943},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000003c9053f0cfc934c02907c17265b01876683994985cebdcab7347","index":2425176},"confirm_microblock_identifier":{"hash":"0x1a76b3e170a415a27c6fb7c37fe42b6ae1baa3bd2e4585913bde1a700b2943c3","index":3},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":975,"stacks_block_hash":"0x9258332f20910951e81459fd2bd72c745b9f8feb339e71f99635affcd86b3b10"},"parent_block_identifier":{"hash":"0x20397903507ba10156e13628129f20f55a66181112dbb9435c74ef4a31f2b88e","index":100942},"timestamp":1679310426,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x666c6f77666c6f7731)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x666c6f77666c6f7731"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":5},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d300000000000000070000000000000bb80001280318e2c3e5735f966090d0b5873b4e802ff33d1d58bc80aad5ba3ce73653c418f83c7db8bdd58d1c82ee198e00fd8e74a7aac186928b3f721331138a7dcdf3030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009666c6f77666c6f7731","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4904686173680200000000086d657461646174610c00000004046e616d650200000009666c6f77666c6f7731096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0xaa24dbfa6581fdbb4138fb084a3ea658d968998ec07d640d13a18c6685ad6d38"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x58e52a97f8d2e56e80e3cd7f69e0997e702bf62553bebc6cf45a447aa1401eca","index":100953},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000028da47c78e7592efc46532b5d7a8ab14e96c6d8c01310cf8f4","index":2425187},"confirm_microblock_identifier":{"hash":"0x0b4b0df1916cdee194bd7585f797f063b0f67bc346ea7aee67588fc8990b5ace","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":986,"stacks_block_hash":"0xeb6c969090a00cdf7818f0f3339d53101ed3cba1a6fb860f626e50d88e9eaf1d"},"parent_block_identifier":{"hash":"0x14744ba4353fb4c63d8237392f9eb94e1b2d1ab83ff71329d67509ced890b25d","index":100952},"timestamp":1679318345,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b6e6c6b6e6c6b6e6c6b6e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":3000,"kind":{"data":{"args":["0x627463","0x6a6b6e6c6b6e6c6b6e6c6b6e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":29,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c09778776000000000000001d0000000000000bb80001f59e191bb2827f070bf32eea4a76a60ecf44e540cdea7aa0f086cdb6f23a71f775fbaa213b483adbe179480309e265412f1b32b5a36d54d562b1191c33f39cf2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6a6b6e6c6b6e6c6b6e6c6b6e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4b04686173680200000000086d657461646174610c00000004046e616d65020000000c6a6b6e6c6b6e6c6b6e6c6b6e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xe6a2f9d7da138b634243e4323eef99dab7051849e2a92349dcbf233dc612cab4"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x42f42d8daa65102f01a979652e31bbee261681003467a583c85f8205f1035c93","index":100958},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000024838c489ccfed90322718cd61a2b0e7b5108c6c30ed48e76e","index":2425192},"confirm_microblock_identifier":{"hash":"0x48a3c694c10ce551f7d7d4daaa4fb9a1a94dada504fa94edb24c2a6a13e9e1ca","index":0},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":991,"stacks_block_hash":"0x4b6ec6b6ec4d070055b424df8e52dc0001cbaacf3164e748a180fccf90918775"},"parent_block_identifier":{"hash":"0x7c6cd89f742aaba03d5e0790b3b7c7f9c81ccfe83c5d48e4b3769972d418a478","index":100957},"timestamp":1679322615,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737435)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737435"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d011c05d550b40b28f943f41f1914780e58a117200000000000000020000000000000bb80000db08590cf47ac7d1faa5c2f14e42847ef977f0cd972e2f702834beb74dcb9e767c8598c89a68a575babe789b0678a6b08a131a27cad4272f74d6192f65cf91fd030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737435","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4e04686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737435096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad011c05d550b40b28f943f41f1914780e58a1172","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3813G2XAM5M1CMFJGZM3WCH8Y0EB2GHE89FX450","success":true},"operations":[],"transaction_identifier":{"hash":"0x3777ebde668eda00c88c6b711eda97ed9fbf8efcea875de47b25f7e40ea9bfde"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb4988bd8b3ed3b28be4dfdb4a338df1765a593ff20fcf0b2c47222b7d2c5514b","index":100965},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000002852fe140e745870a2fddfc5943ae8246bff1e72a6461adccc","index":2425200},"confirm_microblock_identifier":{"hash":"0x1dbb918dfe8424c11f149f91f3d20271b3a53333e9e4308f2a925b9210f29ada","index":1},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":999,"stacks_block_hash":"0x1b4d1583179c3515c7da39941c5bcfe3cfb187f13c8b43ec280a3456a45da157"},"parent_block_identifier":{"hash":"0x80ecbdb577738741868718ce10d92ca5c31deb9d1485ce3306957254d6df00f4","index":100964},"timestamp":1679328419,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62676267626762)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x62676267626762"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400824aa968bb0fd20d502a5dd6e8b1828124acc70500000000000000060000000000000bb80001f67ebaf43b9cb10afafab1b3511ad0664803000767a0517c6a8ad2dabc71367474d8579c018e3d3d81e14841020592c62dbffd1a35b2a3ec11ee1d8dd81164d4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000762676267626762","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b4f04686173680200000000086d657461646174610c00000004046e616d65020000000762676267626762096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a824aa968bb0fd20d502a5dd6e8b1828124acc705","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST214NAB8QC7X43AG59EXDT5HGA0J9B670PN9S5GX","success":true},"operations":[],"transaction_identifier":{"hash":"0x68de6008df8eb6fe02ec95a070ae4114235e9d99e4c46eae0df1eacffd755e4a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x019f86fe64c84e50745fddddb18eaf25744158af7785c2915dc59a06a8c5c7f2","index":100966},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000004295d383dcdc4b2d9ac2c6c34401691bf2d5f9fd9f6a0f184231","index":2425201},"confirm_microblock_identifier":{"hash":"0xe9229f6dad36d3d7a3f7115846920eb1d33680e4459e827a42e0c4d0d2d4dcb2","index":2},"pox_cycle_index":404,"pox_cycle_length":1050,"pox_cycle_position":1000,"stacks_block_hash":"0x19e8a30d2566a14d5f0216960945b64572b84ac0aff948759c44fe04c0cebb6e"},"parent_block_identifier":{"hash":"0xb4988bd8b3ed3b28be4dfdb4a338df1765a593ff20fcf0b2c47222b7d2c5514b","index":100965},"timestamp":1679329097,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c79746373)","execution_cost":{"read_count":16,"read_length":43995,"runtime":166750,"write_count":2,"write_length":156},"fee":3000,"kind":{"data":{"args":["0x627463","0x6c79746373"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":1},"proof":null,"raw_tx":"0x8080000000040015748d4fab3bd14c369030378468b5af3b6ed58f00000000000000040000000000000bb800019a1b54202c4f4b227a151e429b564a7f3d2fcc21c564885ae2e3dced48ad48c11ac1b602b4da6ea7dd1b30081a4725e319642aa2b8623cf4ddf5d3530d9a335c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000056c79746373","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b5004686173680200000000086d657461646174610c00000004046e616d6502000000056c79746373096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a15748d4fab3bd14c369030378468b5af3b6ed58f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STAQ93AFNCXX2K1PJ0R3F138PPQKPVPNHYDKH08A","success":true},"operations":[],"transaction_identifier":{"hash":"0x07453f63eae1c469e02b69d9187a02be5a67fc7f0af8ed1f1d8ac763ad159855"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf82a5f9a6fd19c418c50802efc2ee094bff53da61c2083f8941291dbc260a858","index":101021},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000009739d32075db8ef16d3d608acb91bcf81708f2789806f8b23b2c","index":2425274},"confirm_microblock_identifier":{"hash":"0xf4d20307b35c7ce3ed847c33f26fba721385fd7d2b1a4f434ca97f12b592d668","index":3},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":23,"stacks_block_hash":"0xfb74d4d3d5b18e4bbabd62160d1b0ffa18ae8eb532ceadd20a82a39129f4aec2"},"parent_block_identifier":{"hash":"0x5f880cef99754a3e25df6083319df3210b706dcd8f5cdba01ed7ad81c032e272","index":101020},"timestamp":1679391571,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x67636867636c6a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":3000,"kind":{"data":{"args":["0x627463","0x67636867636c6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":33,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000210000000000000bb800008a5ec00a578d8d3b76650049285b0467db67d4d260e71e2110f15e0ac0ce28ad393f21fa710cd5b70ccaac097146a5a6df6c2c41a47994be07002dfdcedcfe6b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000767636867636c6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b5a04686173680200000000086d657461646174610c00000004046e616d65020000000767636867636c6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0x1f76bdc36450fdbf9960a5df95ba3fb0a6594fb1cd4407d279c9e5c556b70e67"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x76691b1f53d6b529b8b7eb5c601264b79cb749fee01286562b95facb726bc4ca","index":101118},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000001162a101e7ae48a687247de5dacd2dfe370c07fb30c956b9e829e","index":2425378},"confirm_microblock_identifier":{"hash":"0xe83b6a12434f762ae41f63c63ca150ae9a47e9343f711a935027ff36ee42a864","index":3},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":127,"stacks_block_hash":"0x49589c7e4c111e16aa47902587042d23cc3224a37b78e98633b8b1650d48e524"},"parent_block_identifier":{"hash":"0xa6183f1f9424b8a6517ca0aeeefb303a72cd9cf8ba7264f49995ddd2bfd34f4f","index":101117},"timestamp":1679469338,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x676466676261646662)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":3000,"kind":{"data":{"args":["0x627463","0x676466676261646662"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":35,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000230000000000000bb80001dd24891c26cd80bbaa02da70912f385bb6c82ebf8734ee89b79f560b2639647a15507b7e51abfc8a3fc87e631b7bbd39a59af7c4a229e0c9b0f895219f9c39ba030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009676466676261646662","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b5d04686173680200000000086d657461646174610c00000004046e616d650200000009676466676261646662096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xc6b582bef609e61ed45ae0908409bc0a8b74198794f3d336f6d33df6ecfb4848"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x35dc2ecec74b2208daba3519d9e1b95b099bb04d00bcb50b5000a1d12df698ad","index":101122},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000029f02fa5359973f68abc2683f725d2ba3925fb8f1fd83bdac3ef4","index":2425382},"confirm_microblock_identifier":{"hash":"0x04a113859cafd07cdf9f9de01d9d502b46563275ca08dd64524aa24e03e4a527","index":3},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":131,"stacks_block_hash":"0x9f2a552428dad5213845a3ae0dcb1169d4d91eab57be53276b77b63fa6f1cfd4"},"parent_block_identifier":{"hash":"0xa914828835a013f838a3b5d09cc735d2febcf8d7d683886b604329db165b09cc","index":101121},"timestamp":1679473777,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6d6b616e6a646362696173767963)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":3000,"kind":{"data":{"args":["0x627463","0x6d6b616e6a646362696173767963"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d3000000000000000b0000000000000bb80000d69b8bc5bae8f83e6fd6285bf9515b9dd8cdfdc5fcb4105dd252cff6b0d28e497b5600a11353cd1f7781e108d965cd7d7fd82c3ef5123d0e8325bab3f61dc58e030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e6d6b616e6a646362696173767963","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b6104686173680200000000086d657461646174610c00000004046e616d65020000000e6d6b616e6a646362696173767963096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0xd01f12a6666c639228d062463f0a2b9945fca766c15264c77320b3313c915b6c"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e7465737433)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":3000,"kind":{"data":{"args":["0x627463","0x646f6d61696e7465737433"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400d996ed7e31d1b4bf8d056d21f418540c782e701f00000000000000020000000000000bb8000176e2df11881a23f5ead6772471f9aca4572cc563c186357fa39105e2ca2500b0781920f0f048ef21c9d0898b743c39fa3330c1e26525a4f12ffc9ae17a0647c2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b646f6d61696e7465737433","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b6304686173680200000000086d657461646174610c00000004046e616d65020000000b646f6d61696e7465737433096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad996ed7e31d1b4bf8d056d21f418540c782e701f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3CSDVBY678V9FWD0NPJ3X0RAG67GBKG3WQKZZ13","success":true},"operations":[],"transaction_identifier":{"hash":"0x3ea96432382b00f17b3692b2ac50117f73cc7455bd074b0d9248a40be7b96158"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc91f61cf29c57ce6403cd788946ec802b41c9d14e003f66b100a4ef9d79f9c32","index":101353},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000028726a3c2fc10fdcd2244302a38e800d3e5ab6ff3570ce71e4","index":2425640},"confirm_microblock_identifier":{"hash":"0x141b8db76b71a21e5c339af4cab790e1d9043cf5f6183d622a7af0cec16e3686","index":2},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":389,"stacks_block_hash":"0x46b49a36242adaf330e61a3079721d164c68e45f63d820d15bf103c7f9842467"},"parent_block_identifier":{"hash":"0x1bdf56f8869e695fc83cd6391cd02d775cf67dc218ae83259f8602f278cc04ae","index":101352},"timestamp":1679649487,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b73646e766c736b646e766c736b646e76)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167413,"write_count":2,"write_length":169},"fee":374911,"kind":{"data":{"args":["0x627463","0x6c6b73646e766c736b646e766c736b646e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004007a4389649f07fd1bc0383216339055b5922005cb000000000000000c000000000005b87f0001d04ce03c15fcb69aa8e12dec28146ad2135e4a686e955316f1a0d6ec34955c1c6f51649821733c5401557977c5148e0ef3a426455516e643f63ea9c91f19b946030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000126c6b73646e766c736b646e766c736b646e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b6a04686173680200000000086d657461646174610c00000004046e616d6502000000126c6b73646e766c736b646e766c736b646e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a7a4389649f07fd1bc0383216339055b5922005cb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1X472B4KW3ZT6Y070S1CCWGAPTS4805SCT6P4WG","success":true},"operations":[],"transaction_identifier":{"hash":"0x5ce1b0c63ca5b07cfbd5f5496f4697f2333d042f6ee240a4fde12282431c93de"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd0468e005fc74f07e32e5103c02555a25297b92570577d1ed2a004dd357a59c4","index":101671},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000257acccf78d2e98a4e16fee7d494f621c354999c16be7ab2f9","index":2426067},"confirm_microblock_identifier":{"hash":"0x7224e1c1fcd4cfd084c247c74657f5bd308f227c37e5b5be6ba717acf9dc63a3","index":0},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":816,"stacks_block_hash":"0xf59eb9dc5afd3053318f18418959927614aaa442babd210c1f8e087895c5036e"},"parent_block_identifier":{"hash":"0x91490e51924c055c5d6e86b8bf1691c4b20f6c70881df338d6bbd61db966d0b3","index":101670},"timestamp":1679895588,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74787465737434)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":6710,"kind":{"data":{"args":["0x627463","0x312d74787465737434"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004002fb0ec2ba051fcda050d1ad134b72297edc9ca22000000000000000a0000000000001a3600019e638a18008fc9d43b70434eedad91b1d30c3fcaa2415ac9f6cef1af14e42fce5586fdaf2f0662e64cb9418222d777a3a155259d4e9dfbbe321d4f4647a74c06030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000009312d74787465737434","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b6d04686173680200000000086d657461646174610c00000004046e616d650200000009312d74787465737434096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2fb0ec2ba051fcda050d1ad134b72297edc9ca22","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STQV1V1BM18ZSPG51MDD2D5Q4ABYVJEA48K29AKB","success":true},"operations":[],"transaction_identifier":{"hash":"0x5a89d90c4e64bcd29bae494b40569817ebb332df127c595e52455a6fc7783a49"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd5bf8d07e047cd0a5d91153f6885654f196b432275e20df09e934ecf10786ff6","index":101699},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001290d32dc2108f9acea7335c54375c35b6a48faee7296a56e3","index":2426096},"confirm_microblock_identifier":{"hash":"0xaa224bc15cbf0c7a04a20f3c7b2d74d753316012715ae15343e7ab61fb6401ce","index":3},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":845,"stacks_block_hash":"0xccb4df598d9ea61a6f6bbf7e60094c6abfa990e146407ab01411f68c2cb7fa8d"},"parent_block_identifier":{"hash":"0x64af1232784784c3cd843936fcefba69f7c974f3f5c2fc658fe2966b706d987a","index":101698},"timestamp":1679915640,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736a6670717765686976626b73646a6276)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167362,"write_count":2,"write_length":168},"fee":19078,"kind":{"data":{"args":["0x627463","0x736a6670717765686976626b73646a6276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400d996ed7e31d1b4bf8d056d21f418540c782e701f00000000000000050000000000004a86000024b6001c92dfdf2e88ea256060e5df970acc8f242770ac88911c774c32b2eb4f6d61049169a1d0f4a7697b7ac33c0883db240fbb88219c511985755343dbc80a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000011736a6670717765686976626b73646a6276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b7004686173680200000000086d657461646174610c00000004046e616d650200000011736a6670717765686976626b73646a6276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad996ed7e31d1b4bf8d056d21f418540c782e701f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3CSDVBY678V9FWD0NPJ3X0RAG67GBKG3WQKZZ13","success":true},"operations":[],"transaction_identifier":{"hash":"0x9b0f34434697c7ee04b27b037ff66eb89ecc8e7bfc8384e50be37d83f88ffb43"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x661d547f94c64e5e17e815c0ee1ec70d4ed1a9e6cda446e8a62d88fb158423b6","index":101713},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000001a1589696ff25ed0335528ca45b51f98aae8fdba1f91f6602","index":2426112},"confirm_microblock_identifier":{"hash":"0x992f24bc5f058f6cd46d54896fed2ca254b2df7e1d90bebf47f5c55323102253","index":3},"pox_cycle_index":405,"pox_cycle_length":1050,"pox_cycle_position":861,"stacks_block_hash":"0xae6f14dbd46ed02995ac0ee392ef4a2303be59d6ae9057f0cc4eeee2a9df41a2"},"parent_block_identifier":{"hash":"0xec24d0f0708cd6b610f0dbf0079ce456f7d578bd829f1f94f1d03c9f29b8d42f","index":101712},"timestamp":1679927137,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x646f6d61696e6e616d65)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3313,"kind":{"data":{"args":["0x627463","0x646f6d61696e6e616d65"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d011c05d550b40b28f943f41f1914780e58a117200000000000000040000000000000cf100000906c9bf8b086d8aa1f738052ee1c40e8656fd5d9344364759fd5b20f70d8ce636540762ee0ea7e774e024b8bf1916de1079b2eebd07fb730f3db9f89b96e758030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a646f6d61696e6e616d65","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b7304686173680200000000086d657461646174610c00000004046e616d65020000000a646f6d61696e6e616d65096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad011c05d550b40b28f943f41f1914780e58a1172","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3813G2XAM5M1CMFJGZM3WCH8Y0EB2GHE89FX450","success":true},"operations":[],"transaction_identifier":{"hash":"0x8f13e1b6077ccb53849e62f7238535250319b91ed58210df81cc62cb7a3bd94e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x22496d3a6ab82fbe1617af2ddfd9132500858779275b0f3dbc865f873b0c15bb","index":101939},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000027d48c65f765a144abbe4f374f02cddcecd9150c809e6b293a","index":2426364},"confirm_microblock_identifier":{"hash":"0x81a5398c37f66c5e121f555d46417e9d78e72b1273fc68ad95cce3328430b221","index":1},"pox_cycle_index":406,"pox_cycle_length":1050,"pox_cycle_position":63,"stacks_block_hash":"0x887cdaaaa7eb0126fdb5ea8869edfbaf5034edb2e4f7e6a2f96da3430f6a007d"},"parent_block_identifier":{"hash":"0xc82936b62a7470e373736b7fcd1a9e47fb278dd0ef3d77a98d1c8b8266ebaaed","index":101938},"timestamp":1680089313,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6c6e76736c6b6a6e7664)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":6374,"kind":{"data":{"args":["0x627463","0x6b6c6e76736c6b6a6e7664"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":29,"position":{"index":8},"proof":null,"raw_tx":"0x80800000000400714eb6c48636eb734c823bd4cee142b828356778000000000000001d00000000000018e60001126768262abaa6c19865249141caff98335ce802ee718da79607488654c3c66776152f95b2d93bac75d1da202863f5b723857e9068441dad47a51e54ad4f12ee030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b6b6c6e76736c6b6a6e7664","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b8b04686173680200000000086d657461646174610c00000004046e616d65020000000b6b6c6e76736c6b6a6e7664096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a714eb6c48636eb734c823bd4cee142b828356778","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1RMXDP4GRVEPWTCG8XX9KQ18AW2GDB7F1ZDHQQQ","success":true},"operations":[],"transaction_identifier":{"hash":"0x2f58679a341e27cff7d30fa8f3078d1817fbb88175e3e17dd66b1acb86ec82ea"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0f30b3c46cdb104ca4366f9f5974b6b16f078558e5c7d05e1cabbdfc84a4791d","index":102060},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000182a6937d77ce69ac30e7deaa3100a8c2bdd208e334b5b8e1f","index":2426561},"confirm_microblock_identifier":{"hash":"0x76f6e7c7982e0559f02b817a2cc6cdfee06d8285afa21b2f05ddab723119c37c","index":4},"pox_cycle_index":406,"pox_cycle_length":1050,"pox_cycle_position":260,"stacks_block_hash":"0xbe6d53772aa69a42ea87d86876a73c55b62f0e07b6cd1a9b89fa75acc31e64b0"},"parent_block_identifier":{"hash":"0x3aeb03e763b82128a8fa4e063c53ac7b2fe7b3339b3cb4a20cef4e409d8eddf0","index":102059},"timestamp":1680177373,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6f6e6574776f74687265)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":3566,"kind":{"data":{"args":["0x627463","0x6f6e6574776f74687265"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":7},"proof":null,"raw_tx":"0x80800000000400ed00fb06edc442679f772c1776e0dd695f85e55900000000000000110000000000000dee000086149338ff9ed0626bfaae2677f2e6a67706f66fe5b10acbd754ebdf516219ae2e444ba06d0590b52926b00ba05044d22671b0a41f79238d2f20fe8878f900fe030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a6f6e6574776f74687265","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b9d04686173680200000000086d657461646174610c00000004046e616d65020000000a6f6e6574776f74687265096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aed00fb06edc442679f772c1776e0dd695f85e559","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3PG1YR6XQ244SWZEWP1EXQ0VNMNZ1F5B4FXAJYB","success":true},"operations":[],"transaction_identifier":{"hash":"0xe4eeaa3dfad7ec8d360b10de27d3f5af1c35237f98610be1c2fa7c11bb11d901"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x77c5311328eab9628d654e04ea2a5c4e218d02b842f4c52131c0fcf571d3b2da","index":102593},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000a04d0096e68fe40903d01e890ab5d61d932173078b22b5143","index":2427205},"confirm_microblock_identifier":{"hash":"0x5393993ab4c2ca4b28311fcf005dd92a4525618e6650cfd552ee7557d2543d96","index":2},"pox_cycle_index":406,"pox_cycle_length":1050,"pox_cycle_position":904,"stacks_block_hash":"0xd5b57dda0a2e23549ac8c1c9dc5dd918e0d70116cbe1e77b89f547828d895742"},"parent_block_identifier":{"hash":"0x486bea0d40a759467e49b19e3e6847588205d970bf668ead9a41d85c2bfed373","index":102592},"timestamp":1680523100,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x687472736a79)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":5746,"kind":{"data":{"args":["0x627463","0x687472736a79"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400909b3b63ac083b69d76f08df2a013f299a3659950000000000000008000000000000167200018084a4b9a660a5f18f3a819eca1b417a0a669ba0297fac1b72c14a2fdee9ea2a2caca17c826ee1142edec286c4ebbdb238da359c11fa23eaeb30cfda387ac428030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006687472736a79","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000b9e04686173680200000000086d657461646174610c00000004046e616d650200000006687472736a79096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a909b3b63ac083b69d76f08df2a013f299a365995","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST289PEV3NG43PTEQDW4DYAG17WMSMDJSJQ8P2KND","success":true},"operations":[],"transaction_identifier":{"hash":"0xa5de2f2ff9ca3e8e9a9984613f6f3682cbb15a5967a755c18282fa35e115be21"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x645869a0112304fbf6cca7a3c4f8995fe082a8acd77fcd832851b56e43db7aa8","index":103409},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000bc691d447d5017180a72bd78bce8b983b7979a6f4704436e48d0","index":2428209},"confirm_microblock_identifier":{"hash":"0xd9e0e9187b44ecd6572580e68181653642b8be6f6654bfa6d35af490c01ee2cf","index":2},"pox_cycle_index":407,"pox_cycle_length":1050,"pox_cycle_position":858,"stacks_block_hash":"0xbf2152445378f97d91ee96c82c888646c3e696e059aab4f56f60bdf1ff69e700"},"parent_block_identifier":{"hash":"0x4ad3f5f96faa9a7b0b7b56fef08e64c66fa382db582af26e40ff92a70943bbd8","index":103408},"timestamp":1681065205,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72737468776772736772)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":142770,"kind":{"data":{"args":["0x627463","0x72737468776772736772"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400a08b49409b03b11d0b7b90dbfeb2339b6127f6d600000000000000040000000000022db200014210302178a14c5530aa2b9bb3ff315f313c3d26312258d91ac03fd5dc8fd7b37e82ce4c064961fa2cfcdfe8279190f4411f6a4303e1259d1120688e040cc7b9030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a72737468776772736772","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000ba704686173680200000000086d657461646174610c00000004046e616d65020000000a72737468776772736772096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa08b49409b03b11d0b7b90dbfeb2339b6127f6d6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2G8PJA0KC1V278BFE8DQZNJ6EDP29ZPTRS12Y9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x88e4dbf78406841af33ad6614f9d04a502826b78c61afad912286805dd683584"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd08d89ef37e5c654f18cffdc166b6e236f228197d8e6b01e83d092071852f814","index":103507},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000001b2c8529901836c39a450fc31bf61a8fb9e30811ff58f79d47bf","index":2428313},"confirm_microblock_identifier":{"hash":"0x51144da1c0cd34aa1b3207ab260bc74dc0d03e70c4a1c42ecca46b450b307f57","index":1},"pox_cycle_index":407,"pox_cycle_length":1050,"pox_cycle_position":962,"stacks_block_hash":"0x589d69fa27e8c0dbd96f5d0fe31ea0bc607d5e8d8771bda403954207f8b0bcde"},"parent_block_identifier":{"hash":"0x7cfc1b0201ccaf869ae987975a83bd24b7219ea17e0ca60c6cadf32801b9ec9b","index":103506},"timestamp":1681125558,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x746573746e6574)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":750000,"kind":{"data":{"args":["0x627463","0x746573746e6574"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040095d873b1c6e1f6b5ecf4f179ebe82fc676e8a8bb000000000000000200000000000b71b0000045648b06916b5b154c4f7efc3fca3deaf0292392e07731812f029b8436db071a73bf4b87db2c7dd7909fbc3d4eeb03d760e4ba12a58bad8bfc4f382068f039de030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007746573746e6574","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bb204686173680200000000086d657461646174610c00000004046e616d650200000007746573746e6574096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a95d873b1c6e1f6b5ecf4f179ebe82fc676e8a8bb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2AXGWXHRVGZDDFCYKRQKTZ85Z37DT58QF6MH5G8","success":true},"operations":[],"transaction_identifier":{"hash":"0x26f627c1ec55d456cb5618cfad89dfd7e10d863b586037f596b09d7395c25006"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xb958b43ab5e85b30e91115e0704702cbe1a7b85c38dfa106e9e4402b84b72a1d","index":103510},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000705b34329351308bb234db90b19fb5c7b7acc2d4daea015ff","index":2428318},"confirm_microblock_identifier":null,"pox_cycle_index":407,"pox_cycle_length":1050,"pox_cycle_position":967,"stacks_block_hash":"0x69eeb6d047953a587c24d85b41725fddc83f4bd9c9a6d4a5b7572cd6d44b8451"},"parent_block_identifier":{"hash":"0x9b23a09b49d80db721a6b3ae19decfb53fafec217589bbbca4eafa03244bebbd","index":103509},"timestamp":1681128206,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x777466757564646f696e6667)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":579745,"kind":{"data":{"args":["0x627463","0x777466757564646f696e6667"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":13},"proof":null,"raw_tx":"0x808000000004001e9dd422cec4fa9d8ff291814043e385ff645e75000000000000000c000000000008d8a1000062c8ec1485552fc621937b0c4a48e7d9d5e3b3c581b0d05ea8c60d37a0a082db3f8486069c52e2acee682f6fe99dba00195b32abf85f850230d294dcb7e9baca030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c777466757564646f696e6667","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bb504686173680200000000086d657461646174610c00000004046e616d65020000000c777466757564646f696e6667096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1e9dd422cec4fa9d8ff291814043e385ff645e75","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STF9VN12SV2FN7CFYA8R2G23WE2ZYS2YEN8CE0XM","success":true},"operations":[],"transaction_identifier":{"hash":"0x317395097cf945f3af2fcc63e89493b1813db5210edffabea09bf4947d925cc2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xe5bed45360ed1b563bb4fc1741be265cca8e0d95703b619aa301922a7acd9116","index":103516},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000dcb35ac7b1f4e2e35585b89de9907d06517299569cbb359d2","index":2428326},"confirm_microblock_identifier":null,"pox_cycle_index":407,"pox_cycle_length":1050,"pox_cycle_position":975,"stacks_block_hash":"0x34408ff925ae8afcb8eb203a9533c80c03090913c32f32d29ff28ee3bdde5fcb"},"parent_block_identifier":{"hash":"0xa11cae9ff99d813a116d179a29be1af79c03a4ca25d6a3823b8c29270601ef7f","index":103515},"timestamp":1681135367,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x312d74782d797579757575)","execution_cost":{"read_count":16,"read_length":44013,"runtime":167056,"write_count":2,"write_length":162},"fee":244873,"kind":{"data":{"args":["0x627463","0x312d74782d797579757575"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":4,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400852736929dfe2f4e7bbed70081beadb13c83c3690000000000000004000000000003bc890000b12f2c7f57fcf452159b67d21c9fb56b2b204e9fa427f0238162f036e987699f3c28aed86b245dff81e20f234f3b3b4420031511ff8521baa94270386dd29b90030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000b312d74782d797579757575","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bb704686173680200000000086d657461646174610c00000004046e616d65020000000b312d74782d797579757575096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a852736929dfe2f4e7bbed70081beadb13c83c369","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST22JEDMJKQZ2YKKVQVBG10DYNPRKS0Y3D5HVK5PH","success":true},"operations":[],"transaction_identifier":{"hash":"0x6200e22fc7b48501c2c3ddea0095275fef1a61ba76beb98b6e0d965ad28cfd70"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265706c61636564)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":244873,"kind":{"data":{"args":["0x627463","0x7265706c61636564"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":9,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400967d775781d098dd8832dcbf5820aa5f757cec590000000000000009000000000003bc89000093cb756be280819603f8d4157296d84494c42735b4422fed31e6466cd8a412833e421b4d5d2e58612ab940b215899eaac95e1e32d3b061ffe2ed06d7b8fbe5b0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000087265706c61636564","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bb804686173680200000000086d657461646174610c00000004046e616d6502000000087265706c61636564096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a967d775781d098dd8832dcbf5820aa5f757cec59","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2B7TXTQG789HQC86BEBYP10N9FQAZ7CB5E25D9K","success":true},"operations":[],"transaction_identifier":{"hash":"0x2d3e426db294d4fa25b7488dd5f209c30dc1f8fd8f99424b3b580726c2e63801"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3800ff3170943db76fc66081db65fd38da687ececd70f51294c53c735d047e4c","index":103542},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000020c3b60ccfccb9122fade1ccf6258791671cfd43434dd3fc5f","index":2428356},"confirm_microblock_identifier":{"hash":"0x23337f08019286cb7b1fb720ff40edba71bc4df4583299e44bc1321ff66675f2","index":2},"pox_cycle_index":407,"pox_cycle_length":1050,"pox_cycle_position":1005,"stacks_block_hash":"0xcb53b392a75cd9960f40630763a3bed2b166d9ccdec2edccb245dbceb7c74cba"},"parent_block_identifier":{"hash":"0xa4fc6308dc3b8f864edbb835583093046635f379b34266b936c6c2f7d33ccff4","index":103541},"timestamp":1681152282,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f69757974)","execution_cost":{"read_count":16,"read_length":43998,"runtime":166801,"write_count":2,"write_length":157},"fee":79770,"kind":{"data":{"args":["0x627463","0x706f69757974"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400fd07ac2bb4feefb4fc6e37c6c8dae3bd0a2543040000000000000008000000000001379a0001760c271490c7835769478427692793f3bb33db007c3bf82604b5cbd1842b9cd55b83db347c53b919ff333e26ee2450ea2213a828cac8776329a452b588e6bc0b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000006706f69757974","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bbb04686173680200000000086d657461646174610c00000004046e616d650200000006706f69757974096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051afd07ac2bb4feefb4fc6e37c6c8dae3bd0a254304","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3YGFB1BPKZEZD7WDRVWDJ6TWEYGM9A30H4Q0PHZ","success":true},"operations":[],"transaction_identifier":{"hash":"0x6881e6ab5cc3a0d46af57b0d3acf7f45564ac2f9b4dac5f18911edf3fc03c7ec"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x161e3e48e0b0b2100261e1fc6e3adbc3ccde385dc9b9d5ca6d87d9d7060354e2","index":103655},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000c2cdaf0e4ae124239976b7fac17a9be53d8ae46b3efb12982","index":2428606},"confirm_microblock_identifier":{"hash":"0xc1fa7b4c25778c3b7809033b981910afdb8fef1db597e33b391b84cd26b755d8","index":1},"pox_cycle_index":408,"pox_cycle_length":1050,"pox_cycle_position":205,"stacks_block_hash":"0x510133c7dea851c2224e329d4c0d2a02394c99eb5ee4945fdd91b476327a9f1c"},"parent_block_identifier":{"hash":"0x58128da55fc7121102f428927017c2978e49433943fabd39a7ce6d3d0cf542ce","index":103654},"timestamp":1681298389,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616a6565622d3132)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":589063,"kind":{"data":{"args":["0x627463","0x616a6565622d3132"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":1},"proof":null,"raw_tx":"0x808000000004009826e863e38e708774b71a961c516032c6dbd4990000000000000002000000000008fd070001076363f1e10d154aec0a22b4b1bfeded05f8b051e9520095407639c9c85ff3c93343dc03452ce73b2598c776233eb0b90176fa7102f121a196ce5c0a34bcb13d030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000008616a6565622d3132","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bc204686173680200000000086d657461646174610c00000004046e616d650200000008616a6565622d3132096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a9826e863e38e708774b71a961c516032c6dbd499","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2C2DT33WE7711VMPWD9C72HC0SCDPYMK7YBX4AV","success":true},"operations":[],"transaction_identifier":{"hash":"0x8e9823acae04c87caf0a98ee5a57a3edeb7c2de1c935a0698011f160c02f6509"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0684b932413b1ab4c3a7662f50995333c380e08b44c6cbb92c820d39170a2c12","index":104198},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001794ef6446787ef12fb7e97a88b294a5a1a32dcea8bd484a1b","index":2429280},"confirm_microblock_identifier":{"hash":"0xe233cc28f8b466e7e4596230d7682bea75905a20ab3ae5f96edf135ffd878f48","index":2},"pox_cycle_index":408,"pox_cycle_length":1050,"pox_cycle_position":879,"stacks_block_hash":"0x856a2adadc54ff3925ed207bfa3e70cf797fcb6c8dcd0dca3e77b67e18f68358"},"parent_block_identifier":{"hash":"0x5eada79fac5ddc46f75da8d37c66f30c721999f340ac9c0f45b414e4fa914b65","index":104197},"timestamp":1681720238,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736c646b636e776f6965686776736c626b7664)","execution_cost":{"read_count":16,"read_length":44037,"runtime":167464,"write_count":2,"write_length":170},"fee":100740,"kind":{"data":{"args":["0x627463","0x736c646b636e776f6965686776736c626b7664"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":11,"position":{"index":9},"proof":null,"raw_tx":"0x808000000004001124c966ba863ba7c8c86cf6c8b436ca411f602a000000000000000b00000000000189840000edfa431c10f54961f694220a620a89827721deb9b4117a1bc5271873ace79f2a15442ac9cd149f15de33215e5eee052a84183b4fad3ee3297935ecd225b6d594030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000013736c646b636e776f6965686776736c626b7664","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bd504686173680200000000086d657461646174610c00000004046e616d650200000013736c646b636e776f6965686776736c626b7664096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a1124c966ba863ba7c8c86cf6c8b436ca411f602a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST8J9JB6QA33Q9Y8S1PFDJ5M6V5427V05B80T6B2","success":true},"operations":[],"transaction_identifier":{"hash":"0x37cf1341020b26035faf0fda48f8fef51b8f115fc3135b6a709a1f3a297ee4ac"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xc2b33ed4381445c716357a8ef7c7552033f79ed8a935b8521ca2d92ef83047bf","index":104206},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000255b58d5915b5af5c57c287e5c0d31a629ee7817f3edc20330","index":2429290},"confirm_microblock_identifier":{"hash":"0x9f7fdb3c86b4762fa0c82ada647f348dcef3830724b7e619057acfb8e10af8ac","index":2},"pox_cycle_index":408,"pox_cycle_length":1050,"pox_cycle_position":889,"stacks_block_hash":"0x2feefb0050504eec507b20d7b7dfafa64733b907ca52b1e9e82bae5b5b607a89"},"parent_block_identifier":{"hash":"0x665d51ab230795414c828bb047eebe8e67a6ca1b8a47b494c2b3f5cb7608dae4","index":104205},"timestamp":1681727013,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736b6a64736b646a666e)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":550141,"kind":{"data":{"args":["0x627463","0x736b6a64736b646a666e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":10,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400293fab26b49ac31ac4d89467dc56fb6df4ce17b1000000000000000a00000000000864fd00011cec2d3715f17154b09ded1be9921c195dc1586b64709b9430bfb05718c0a5b027d8d129d874dea8f4e323bd97cd22807963ab9dcb0bdb2295b1f37511cd52a2030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a736b6a64736b646a666e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bda04686173680200000000086d657461646174610c00000004046e616d65020000000a736b6a64736b646a666e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a293fab26b49ac31ac4d89467dc56fb6df4ce17b1","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STMKZAS6PJDC66P4V2A6FQ2PZDPZ9KGQP4RWT9SR","success":true},"operations":[],"transaction_identifier":{"hash":"0xe588c8289da018fe87310cbb2225e271c6bf20927b24858404bd3bb5b3b0a06e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0813e325903ca3deea10d7098b507afaa352d699f8283fb47db2c7c5b1dc8c37","index":105801},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000065759d238526ea995fbadd75150c82015dd77f5e5ebcb5f999ef8a76","index":2431163},"confirm_microblock_identifier":{"hash":"0x8a69995d90a1ffa778c1ece0ba5f14aeeb53835d8a3a75e74e50fd6e8ca10e95","index":2},"pox_cycle_index":410,"pox_cycle_length":1050,"pox_cycle_position":662,"stacks_block_hash":"0x354fe373411cff716f7b4695c01505356ee64d853c3d9721c7dcbb18b872e4a5"},"parent_block_identifier":{"hash":"0x2ff2a741712dc4d23e9f75beb8596733588f40fea80a84168ec930c303f5c0d6","index":105800},"timestamp":1682555543,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6177646173667367)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":15571,"kind":{"data":{"args":["0x627463","0x6177646173667367"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":12,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a08b49409b03b11d0b7b90dbfeb2339b6127f6d6000000000000000c0000000000003cd30001acb9e86abf3be20e7d4ef569cc73b80a37b59a08ed49550f950ee4b76c0a8f9f4b1c4008d00aa6bd1678f3741f3ea1876226fd8bcb52fbe7e99e6cdcb631ad35030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000086177646173667367","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bf904686173680200000000086d657461646174610c00000004046e616d6502000000086177646173667367096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa08b49409b03b11d0b7b90dbfeb2339b6127f6d6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2G8PJA0KC1V278BFE8DQZNJ6EDP29ZPTRS12Y9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x597aabee20b1593a802690b3abbac31673cb0777e8f762c76a2d36e4c78d6a60"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x8a8796a055482da79bb2ff89f7906660737b7202e052d95353b45f5fcc982cc8","index":105821},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000eb95c86a5dd4b7df8ebcbf035d789dd0a63e53b288b508b80edc31a4","index":2431184},"confirm_microblock_identifier":{"hash":"0x9da5dcdb3fcfbc82d266cbe39a6c89800a6ffd6ffaa29ea191247e48a3fc4061","index":3},"pox_cycle_index":410,"pox_cycle_length":1050,"pox_cycle_position":683,"stacks_block_hash":"0x4fa67e48673c3ac783ffe64fda952bc845e4cbd41cffac605798325dc8b77ea0"},"parent_block_identifier":{"hash":"0x2a41d5a2dafcbf6b15e116462c921667f8d0db634c8adcb4b00e3f1edc81b925","index":105820},"timestamp":1682578956,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6a6b626e6b6a6e6b6a766b6a)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":6240,"kind":{"data":{"args":["0x627463","0x6a6b626e6b6a6e6b6a766b6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":38,"position":{"index":3},"proof":null,"raw_tx":"0x8080000000040093848da413b5311e1efe84e9f1bcfb1c0977877600000000000000260000000000001860000197002b7ba086f655f11563246275dd19f606419fdb77cef976a918aaae28643759e2baf972e0eead302d814152e96d335fb975f4c2abbe3a7e03cbed75254720030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c6a6b626e6b6a6e6b6a766b6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000bfb04686173680200000000086d657461646174610c00000004046e616d65020000000c6a6b626e6b6a6e6b6a766b6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a93848da413b5311e1efe84e9f1bcfb1c09778776","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST29R93D42ETK27GYZT2EKWDWZCE0JXW7ERS23XG9","success":true},"operations":[],"transaction_identifier":{"hash":"0xc2901ae3e88c40ca41a203a8e79eaf911aa1249122f0ed9169c3aefb7fd643dd"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x112fbd3805ef2ca8225cf3cc01d0c9c9ed05887a6ae1b8cdae6714ed7a0ce624","index":105827},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000009f90bfef005b32e576695fab7a223ff6c02723871426a88f4b464e7b","index":2431190},"confirm_microblock_identifier":{"hash":"0x79d161e70145cb2cefd076d721625a3c427ecd4e68f046f4c3cea19b276d25dc","index":3},"pox_cycle_index":410,"pox_cycle_length":1050,"pox_cycle_position":689,"stacks_block_hash":"0x8d94ac96f2d2060aa968f0dc320fb1d494c5b6943fad8caf95ce576887821fb5"},"parent_block_identifier":{"hash":"0x9f6dfb101b57115c6a763429fc90e3ccd295414cadb8c218211805c77de60cb4","index":105826},"timestamp":1682586194,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646c766b6e736c646b766e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":30635,"kind":{"data":{"args":["0x627463","0x73646c766b6e736c646b766e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":14,"position":{"index":4},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d3000000000000000e00000000000077ab00012ef30710b47179fa36a7e948c82da03d3aa3e0e6be1e2d396c2dbc796d5104346c5f92a0c3ec5c8bd7716dd7a3dd9659a5cbf162e85a1608c8715ee74c2c4d0c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c73646c766b6e736c646b766e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c0004686173680200000000086d657461646174610c00000004046e616d65020000000c73646c766b6e736c646b766e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0x446439085939bedc72f05e3a1c6b689079023203a95d7fd54e7c0dee75ca6501"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xd19f2aeea3624a835fb88d65198586fedf540e3f22f332d59c770f13f9ff6504","index":105830},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000009beee2948953f1ef0f0e493907455d373e552fb1a4d1be4dd6f6f675","index":2431194},"confirm_microblock_identifier":{"hash":"0x3c9c06ea06123ef3285d59c9213effa8ba8f6fcebf4ead9385af4ff99dda6831","index":1},"pox_cycle_index":410,"pox_cycle_length":1050,"pox_cycle_position":693,"stacks_block_hash":"0x4e9260cee3fa5869f264d153a1eedc0402f40c69e0b12e6fc747dd7577d6618b"},"parent_block_identifier":{"hash":"0x538a2452e1ff7a4a2bdb0cb52684e54db3271e96513e0c7098dbe28475fdf655","index":105829},"timestamp":1682589798,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x71776f7270716276)","execution_cost":{"read_count":16,"read_length":44004,"runtime":166903,"write_count":2,"write_length":159},"fee":31775,"kind":{"data":{"args":["0x627463","0x71776f7270716276"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":8,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400d011c05d550b40b28f943f41f1914780e58a117200000000000000080000000000007c1f0000cbceface46e095613093c25d15ac6771c4d116efa3d5773e4bb7713540ced2fe478e74463736f8badb0e00c1b8ad488b0798eb0bfcc30772022baf7a205dd578030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000871776f7270716276","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c0404686173680200000000086d657461646174610c00000004046e616d65020000000871776f7270716276096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad011c05d550b40b28f943f41f1914780e58a1172","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3813G2XAM5M1CMFJGZM3WCH8Y0EB2GHE89FX450","success":true},"operations":[],"transaction_identifier":{"hash":"0x26208c0280060f2e13b2e85d605feb0a3142e98c52a443d8ba4f480bb89c7f4e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x55240566c824414106e1d7bec59bcd75f6e239ae6c361875da52c21fae93078b","index":105833},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000099370d5a783515340334a68ce4e6959aaa77dbee71bbdfcf3","index":2431198},"confirm_microblock_identifier":{"hash":"0xb3dd1bf5f077074c43fe5a5f3c8b071a191e7e0d7b7eb0dae6d70045329d72cc","index":6},"pox_cycle_index":410,"pox_cycle_length":1050,"pox_cycle_position":697,"stacks_block_hash":"0xd23d71bea08a19f569748653a59337d3064be85f0b5f46d491de173836bf3faf"},"parent_block_identifier":{"hash":"0xe96b0b21ef6e55ea8ec711a850e6dfecef12b4e67a7caf471a675181e612511e","index":105832},"timestamp":1682595820,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x686472667a627a)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":2000000,"kind":{"data":{"args":["0x627463","0x686472667a627a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":15,"position":{"index":6},"proof":null,"raw_tx":"0x80800000000400a08b49409b03b11d0b7b90dbfeb2339b6127f6d6000000000000000f00000000001e8480000131ee0c35365b78e37b8a5c3adb000222dac4dc5b94f38fa774639b3a761865cc0f2d02d5fb3d241ff771c8b26fd6db9becb8580a0ce71958cb282e4816f420c4030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007686472667a627a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c0904686173680200000000086d657461646174610c00000004046e616d650200000007686472667a627a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa08b49409b03b11d0b7b90dbfeb2339b6127f6d6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2G8PJA0KC1V278BFE8DQZNJ6EDP29ZPTRS12Y9C","success":true},"operations":[],"transaction_identifier":{"hash":"0xc762abf2e3050ee4f5013d9ba6a8b02fd45f5fd9a9596ace7cddca1275b03b6e"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x331005b74125a9e8516afd857178d10f346de3f66a3f2eccac2124c711391c5f","index":106148},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000f7082555fa5e96bcda5aad3dc2057bc9648534ff44d346516036576e","index":2431572},"confirm_microblock_identifier":null,"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":21,"stacks_block_hash":"0x139b0f56e5c62d07307286de5ab7c87c55b398969a1b72f5ff7d9779a488d80e"},"parent_block_identifier":{"hash":"0x901e74d84a7b244169b3d45badbf0b27e8133128e8620bf9f07e2bd7cfa88cb8","index":106147},"timestamp":1683003187,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73616466617364)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":102180,"kind":{"data":{"args":["0x627463","0x73616466617364"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":17,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400a08b49409b03b11d0b7b90dbfeb2339b6127f6d600000000000000110000000000018f240000da734b03eb13f6745116401fd6c0660f388632d7e8c842f78c841e648314555330f6f5fd1ef9346e634c053c69a0e7b3a34744af6bc522b48f522461060bf2a5030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000773616466617364","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c1204686173680200000000086d657461646174610c00000004046e616d65020000000773616466617364096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa08b49409b03b11d0b7b90dbfeb2339b6127f6d6","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2G8PJA0KC1V278BFE8DQZNJ6EDP29ZPTRS12Y9C","success":true},"operations":[],"transaction_identifier":{"hash":"0x99d1ecef0b08400609733b35ef69bcb0fbe315843f835876516b1168302a139d"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x58eaac06b5ba761089907db191b150e0d842c3e3718a8dae65bf81d8c3119665","index":106595},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000003551bcf2502482941a4dcf812a43d28ceb3ddb7512b9a622290ea12d","index":2432105},"confirm_microblock_identifier":{"hash":"0xe9a96e6025603e622302027865cc3fb2f188960f35a2b0259c0f95fa5221ff0e","index":1},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":554,"stacks_block_hash":"0xcbf822e4f23c8d222c1e5b224a533ab8acdd44cc4cd1d4a7facdb50412f763f9"},"parent_block_identifier":{"hash":"0xd2245ca6458a362202c0103dcc25f80042e3402cc1ed47e564b967a1638bf4ad","index":106594},"timestamp":1683547579,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7364786376626e6a)","execution_cost":{"read_count":16,"read_length":44007,"runtime":166954,"write_count":2,"write_length":160},"fee":296166,"kind":{"data":{"args":["0x627463","0x7a7364786376626e6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":37,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000002500000000000484e60000f84a319b0253af87e9b8fc0a4251f6fd7ee1ffab3365ab919b1211b7ce4a03aa220d07cea2ee909389e2c90a62799746cbf57733f3d93d01d0eaabc23856ec8c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a7364786376626e6a","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c2004686173680200000000086d657461646174610c00000004046e616d6502000000097a7364786376626e6a096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac29f2bc04c3a559f50d45767e3b8c3978952032b","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":true},"operations":[],"transaction_identifier":{"hash":"0x33d07d56d38a7d3594cdd3e636221f6ef0b06aa092947ae3890c5bc7ad27855b"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7364786376626e6a)","execution_cost":{"read_count":12,"read_length":43978,"runtime":122631,"write_count":0,"write_length":0},"fee":296166,"kind":{"data":{"args":["0x627463","0x7a7364786376626e6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":38,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000002600000000000484e60000a7b608c7e3e22dc43b2a6dfc93abdc9f96eb527418b03c963e49a292e635412255018f2bafe0d19a39617f62c9251a4d54b4f3684171552261b35dc622b9f5ff030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a7364786376626e6a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":false},"operations":[],"transaction_identifier":{"hash":"0xee484acb8e5bcd9e74fc311ae97e8f4b044bf73c4a78600ed0e9488ff39411f1"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7364786376626e6a)","execution_cost":{"read_count":12,"read_length":43978,"runtime":122631,"write_count":0,"write_length":0},"fee":296166,"kind":{"data":{"args":["0x627463","0x7a7364786376626e6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":39,"position":{"index":4},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000002700000000000484e60001aafeb37439d9fdc20bcd63dff5311cb1dafc4ded63e55232503dc8de17eae0e8031905012e2f3ba6a563e3458df96fa52d9a2d7135f27583a8edb502d46d2ffe030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a7364786376626e6a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":false},"operations":[],"transaction_identifier":{"hash":"0x235e7320568c63e10d1e3161a73fffb15d5763e2e3239bffe85da7079507ff38"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x62696c61736964626c6173696263)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":296166,"kind":{"data":{"args":["0x627463","0x62696c61736964626c6173696263"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":47,"position":{"index":5},"proof":null,"raw_tx":"0x808000000004002c4673bcc1fcf2bacdae24385dddd9a85d88175a000000000000002f00000000000484e60000e0fbda1d1f40edc459e402c610c327a593552a92c39bb3dcc31e5941938b7c25729c26facdaa06df8e9197939a393ef4781fcf0e4df60f15cbfc18c54e3d2d04030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e62696c61736964626c6173696263","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c2104686173680200000000086d657461646174610c00000004046e616d65020000000e62696c61736964626c6173696263096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2c4673bcc1fcf2bacdae24385dddd9a85d88175a","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STP4CWXWR7YF5EPDNRJ3GQEXV6M5V20QBBRY5215","success":true},"operations":[],"transaction_identifier":{"hash":"0xa414682f2602d53f38b6fee3a518b5e822f1e65b80ea2c2d5d92fa01b83dc397"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7a7364786376626e6a)","execution_cost":{"read_count":12,"read_length":43978,"runtime":122631,"write_count":0,"write_length":0},"fee":296166,"kind":{"data":{"args":["0x627463","0x7a7364786376626e6a"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":40,"position":{"index":11},"proof":null,"raw_tx":"0x80800000000400c29f2bc04c3a559f50d45767e3b8c3978952032b000000000000002800000000000484e60001da6521f30ecc2dbcf40375e413376e6a269b56dabfe7a1a89d783780c6cda5ee1ce142e391236a10cc203f594e47b0112340b00b811b418b6914ee932264b2aa030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000097a7364786376626e6a","receipt":{"contract_calls_stack":[],"events":[],"mutated_assets_radius":[],"mutated_contracts_radius":[]},"result":"(err 2014)","sender":"ST319YAY09GX5B7TGTHBPFRXRREBRJMG35D7B28QY","success":false},"operations":[],"transaction_identifier":{"hash":"0x3e7d74eb221c71fc358a5a742c3ed6282b700de7f913d32a79f9793420f51c93"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xf19aaef8a1ceca7243e8ecdbedcef57700494cc473273a0368916af17e939f8b","index":106666},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000009b544c050b257eb196428b2f132b7be08b120eec835bcbb14","index":2432182},"confirm_microblock_identifier":{"hash":"0x85eb207dad8e3aafa593db31036eed940320cfa32340730c7a643a112bca699f","index":0},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":631,"stacks_block_hash":"0xfa276edc24e43471180bb81574cc1f9b91ad56301abe6b657aaa718928a7e629"},"parent_block_identifier":{"hash":"0x4246807b97c33c89e55c8d8e8edfdefe4a04b711eabd79852621f5dd23eacc8f","index":106665},"timestamp":1683626638,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x71706f776b6b6e76736c646b76)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":137230,"kind":{"data":{"args":["0x627463","0x71706f776b6b6e76736c646b76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400a830b5b6ba9b1987d1a4eba94533e2e0ebfca3240000000000000005000000000002180e00014306408386125ee1399af16fc8965897081f6b81a4b5668a67254a6f34b6cc5508755f01b53a1693573d003611eb0abf08af47859445fb383da88046cd4c2b2b030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d71706f776b6b6e76736c646b76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c2a04686173680200000000086d657461646174610c00000004046e616d65020000000d71706f776b6b6e76736c646b76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aa830b5b6ba9b1987d1a4eba94533e2e0ebfca324","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST2M31DDPQADHK1YHMKNTJH9KWBGEQZ534G9Z87JN","success":true},"operations":[],"transaction_identifier":{"hash":"0x1555ac71c0470b281c51a1f5ab528dbd9cbff83ec546c82188635e6edab8c7c7"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0xdd4ad1708103e919422c5f35340040d28bc66acf00e72f9838ec882405783c3a","index":106769},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000df9149ef34916a76e2913762717ead7dbee74895814b8130f","index":2432293},"confirm_microblock_identifier":{"hash":"0x67db465688dad9654801c13497e2c07ca900b2567fa4a6fdcde0f1eaf383c10b","index":0},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":742,"stacks_block_hash":"0xba63d222d6831a77ed14df6feb556035f7a3cbe07b4346b118c2379575d92355"},"parent_block_identifier":{"hash":"0xfe2f7ed521d4ec276f1975a215be0ae94251376e3fb564ece8f659b8c27a408f","index":106768},"timestamp":1683716327,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x7265666163746f727465737432)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":202159,"kind":{"data":{"args":["0x627463","0x7265666163746f727465737432"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":21,"position":{"index":5},"proof":null,"raw_tx":"0x80800000000400254a79735e9607369e43e909c2d3991d2d415bbb000000000000001500000000000315af00016a473689f453a5a48929e1f34687bb4b3a1e41659a9e3b1b0edbbfc93865dafd360f160b25271a15886267f3809abf2b7e015b01f58edca1e1e4df6e4ad4b4a0030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d7265666163746f727465737432","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c2e04686173680200000000086d657461646174610c00000004046e616d65020000000d7265666163746f727465737432096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a254a79735e9607369e43e909c2d3991d2d415bbb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STJMMYBKBTB0EDMY8FMGKGPKK4EJTGAVQDW8KGP5","success":true},"operations":[],"transaction_identifier":{"hash":"0x65d86187c13201fa5c290ab3d4a1a3a6a9b521180baf78e2b3aa7ad5302000ff"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x418a1333cc8697dfc11ce6236ed4acdb4a6a9afd6f717e35b6d59d4a00d86d9c","index":106873},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000005a18e7316fd7d759b1e98586a8a228dee5f04bb39b2ea2c73","index":2432408},"confirm_microblock_identifier":null,"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":857,"stacks_block_hash":"0x9137a27bcedfdf204e127e98555a7bd651ec61b18240bdcef18ec49b0f2bde6f"},"parent_block_identifier":{"hash":"0x246f37b03a98a46715487fb3c9f975de07591e269f3c0b7c2d86d0a0e5f2d01b","index":106872},"timestamp":1683821500,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6e6577746573747472616e73666572)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":25874,"kind":{"data":{"args":["0x627463","0x6e6577746573747472616e73666572"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":7},"proof":null,"raw_tx":"0x8080000000040082484c5adf7e61d16e03f01b6f736ace05587ef50000000000000000000000000000651200017e4407fc298b65c19b90af908b86f65e845f27a0d426ccf46443d0d936e6d4e93da2c5816abcbbafceb70841cfa4b23f4ce8b5865f7e0c5a27485bb6589553ec030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6e6577746573747472616e73666572","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c4c04686173680200000000086d657461646174610c00000004046e616d65020000000f6e6577746573747472616e73666572096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a82484c5adf7e61d16e03f01b6f736ace05587ef5","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST214GK2TVXZ63MBE0FR1PVVKDB70AP3YYPX4PN31","success":true},"operations":[],"transaction_identifier":{"hash":"0x9a27bf468643270e047929a19b701775cb8eebc1e219da814431ecd113724166"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x74657374696e67313233)","execution_cost":{"read_count":16,"read_length":44010,"runtime":167005,"write_count":2,"write_length":161},"fee":25874,"kind":{"data":{"args":["0x627463","0x74657374696e67313233"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":2,"position":{"index":8},"proof":null,"raw_tx":"0x80800000000400fcd415d040677526629dd208223a419d9ca8d5b80000000000000002000000000000651200007961fbd2ea60ddaf5a45ef8bac719b03351467309d0d3154d56107551b9bb9c70f187440ebba6b5d24571381047a7c36f80152626036a142783233eb079dca44030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000a74657374696e67313233","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c4d04686173680200000000086d657461646174610c00000004046e616d65020000000a74657374696e67313233096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051afcd415d040677526629dd208223a419d9ca8d5b8","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3YD85EG81KQA9K2KQ90G8HT86ESSA6NQ19GD3PD","success":true},"operations":[],"transaction_identifier":{"hash":"0x6211767308179ffe862e8d25898fdf185df2283e1ad06bccb1e1618c9386e5dd"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6c6b736e76646c6b6e73646c6b766e)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":25874,"kind":{"data":{"args":["0x627463","0x6c6b736e76646c6b6e73646c6b766e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":9},"proof":null,"raw_tx":"0x808000000004004cef6b61953dc35caa0c2f5e42f71f9551ed488500000000000000050000000000006512000001ce24037b4d63316e702d3664b79755facd7e58bba1a2a8fa5aacbb023a51c367ca1f1e3a00d37ab4834b27919057e29cde8eed7b3ab52f7af689ae92370b71030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f6c6b736e76646c6b6e73646c6b766e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c4e04686173680200000000086d657461646174610c00000004046e616d65020000000f6c6b736e76646c6b6e73646c6b766e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a4cef6b61953dc35caa0c2f5e42f71f9551ed4885","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST16EYTV1JMYW6Q5A1GQNWGQQ3YAN3VA8GMMWFJX8","success":true},"operations":[],"transaction_identifier":{"hash":"0xf11b5757a865c3deecb9d1954ff6c0674c37ed6a4643e96cd78b4a7d564436e0"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x61737661736476)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":25874,"kind":{"data":{"args":["0x627463","0x61737661736476"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":10},"proof":null,"raw_tx":"0x80800000000400c5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca0000000000000005000000000000651200006ff5aa6d3e620512fc16902512faf45111cddff7d6fd577eb44d45e0d4e7deb5115ad27da437db0499824473f0c6a86c5d77453404ab862ddc8036961946f347030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000761737661736476","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c4f04686173680200000000086d657461646174610c00000004046e616d65020000000761737661736476096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32ZAKNAA31HMAEB9JR0MNX2YF4TR3SESBE4HWDV","success":true},"operations":[],"transaction_identifier":{"hash":"0xf0ae6ee3e550a466745f98fc1fca88f0cb9fa6d071abfa14de0ef1f787fef7c2"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x25bb9f2d9cc3761be80997ee8a71613477dde76f8a136a1716570c36f4a1a542","index":106874},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000012e0934504a0390632216873ab9eb83e88123fe0df2424c2f0","index":2432410},"confirm_microblock_identifier":{"hash":"0x1b80e97c8d4f80c768edbc236ae10c1009e36eb2f8a5618112f96ce617884767","index":4},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":859,"stacks_block_hash":"0x6d8f9b9cffd2c91d27aa328c05c3ce424fc9da4ca3fcd95a0f57b1be16dd978b"},"parent_block_identifier":{"hash":"0x418a1333cc8697dfc11ce6236ed4acdb4a6a9afd6f717e35b6d59d4a00d86d9c","index":106873},"timestamp":1683822174,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x706f7177727077656734746e6b)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":35511,"kind":{"data":{"args":["0x627463","0x706f7177727077656734746e6b"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400fcd18ae6a2db757b8716a108617daa2b9d0b96bb00000000000000010000000000008ab70000f063203c261c400e4de88b19cceb057c0f8c23f25177e9b6dc89449f4c379cc52b5bc5c9494a5706da79f9c943af9e5dc379d6c8c325d8aab8cd8036f002c955030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d706f7177727077656734746e6b","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5004686173680200000000086d657461646174610c00000004046e616d65020000000d706f7177727077656734746e6b096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051afcd18ae6a2db757b8716a108617daa2b9d0b96bb","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3YD32Q6MBDQAYW72TGGGRBXN8NST2WPQEE8X6Z2","success":true},"operations":[],"transaction_identifier":{"hash":"0x13a1ff218aa3342f62fdea7c1a27d169738b69993bcd368df9cd365b74a87809"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x763d17ad6db3e7bd59799fe85784da8c4c6e107fd5ae1184522d95fdc534f493","index":106944},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000017b9409818c8a8c9b312d3fb66b40ad92984253243ff73f4a8","index":2432492},"confirm_microblock_identifier":{"hash":"0x3972e2539fec0968d90d4dde3e0463a005d1288db8acc33123b0d5c285a6c013","index":3},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":941,"stacks_block_hash":"0x28f577c85ca295518b84062e64bf9d7647e05605bba0a2619ce2d5bcb0148eb5"},"parent_block_identifier":{"hash":"0xfebea6aa659f7ec6cd21511964e0ddd1ff58dc4c7459aa5aa53e9eeb2bab9a53","index":106943},"timestamp":1683882713,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x73646b6c7364766e736c646b6e76)","execution_cost":{"read_count":16,"read_length":44022,"runtime":167209,"write_count":2,"write_length":165},"fee":15756,"kind":{"data":{"args":["0x627463","0x73646b6c7364766e736c646b6e76"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":6,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400c5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca00000000000000060000000000003d8c00003938c779ccb569e6040ba4a6cbd1eb70939a444661bc4b30e97b2de3f628854469014d2aa9bb978561d9e6d58d1bf9c9ccfc33b9e2ae20f9d56940145795cbdb030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000e73646b6c7364766e736c646b6e76","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5304686173680200000000086d657461646174610c00000004046e616d65020000000e73646b6c7364766e736c646b6e76096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32ZAKNAA31HMAEB9JR0MNX2YF4TR3SESBE4HWDV","success":true},"operations":[],"transaction_identifier":{"hash":"0xbe30e4ab7efe79074009e2348a38fa3aa2fae079d5f06084224712c53ff1c3d5"}},{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x70716f65777270736e7664706b6e62)","execution_cost":{"read_count":16,"read_length":44025,"runtime":167260,"write_count":2,"write_length":166},"fee":15756,"kind":{"data":{"args":["0x627463","0x70716f65777270736e7664706b6e62"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":5,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400537f79d82fd360b9bef39172107b5260f934050400000000000000050000000000003d8c0001f642fdf3c19abd7ff0e4882e4654b680663bd52260dee06e28696d66e0efbe992b8bc68d9cc005d0a0fdd5f72652f11cbcf7e903ef66e2424e06963e1fc4db5a030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000f70716f65777270736e7664706b6e62","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5404686173680200000000086d657461646174610c00000004046e616d65020000000f70716f65777270736e7664706b6e62096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a537f79d82fd360b9bef39172107b5260f9340504","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST19QYYER5Z9P1EDYYE8Q443VA9GFJD050KZWWD8D","success":true},"operations":[],"transaction_identifier":{"hash":"0xc22a9f6c66961ac12302649a67e81080ca81023a51494a3e718ac5808ecfe6eb"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x6c4ba14f906146f8436aaffe7da03d009a2d0df83c105fe86e88bc4e73d3d418","index":106945},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001a3c26463627f9b1bfebbc4131c6ea2556d124974888be293d","index":2432493},"confirm_microblock_identifier":{"hash":"0xa51232657ece2a2f9496c4b1e80fb710bf1ef1a80d24fb9f3de9d20274a99b73","index":2},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":942,"stacks_block_hash":"0xede3213858181ddc8bef968169af25d50e9ecd39f70a64574808e29d1269c9b8"},"parent_block_identifier":{"hash":"0x763d17ad6db3e7bd59799fe85784da8c4c6e107fd5ae1184522d95fdc534f493","index":106944},"timestamp":1683883693,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64667077656f6a666e6b6e7673)","execution_cost":{"read_count":16,"read_length":44019,"runtime":167158,"write_count":2,"write_length":164},"fee":16088,"kind":{"data":{"args":["0x627463","0x64667077656f6a666e6b6e7673"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":1},"proof":null,"raw_tx":"0x80800000000400d80c068a4eb2510207d63e2d89fa5820155deb0d00000000000000000000000000003ed80000388dde44f1084175d65704e9cfdc4fc19af4db29292d8015c317cbc698e827d539cbca26df860466ee213629da64a4d89cfbd518bef6f6cb522c50ceda64a444030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000d64667077656f6a666e6b6e7673","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5504686173680200000000086d657461646174610c00000004046e616d65020000000d64667077656f6a666e6b6e7673096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ad80c068a4eb2510207d63e2d89fa5820155deb0d","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3C0R1MA9TS520G7TRZ2V2FTB0G1AQFB1P8SVC3R","success":true},"operations":[],"transaction_identifier":{"hash":"0x4960653262dea6d51a43c2861dce53ad18a599f7f4ba756e73569ae2c731ef99"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x9a110ca35bbc4746cbbafb1f83b6f750a5ee5e9378bedf6d58ff836c17ade32a","index":106946},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x00000000000000025ff08ec42a0cc8b5e9ae8222a012b6c2c031e38d7a5415a9","index":2432494},"confirm_microblock_identifier":{"hash":"0x795e6a5e926c3827488fa54c869fa4922faf55264f9c9807f2c376fa75afd4ad","index":0},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":943,"stacks_block_hash":"0x68eb93cd0b3c15a702ff5d29d9ebde1714d446072dd2ec3d022b71a932c8dda7"},"parent_block_identifier":{"hash":"0x6c4ba14f906146f8436aaffe7da03d009a2d0df83c105fe86e88bc4e73d3d418","index":106945},"timestamp":1683884313,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x736b64766c736b64766e6c6b6e7364766e)","execution_cost":{"read_count":16,"read_length":44031,"runtime":167362,"write_count":2,"write_length":168},"fee":15922,"kind":{"data":{"args":["0x627463","0x736b64766c736b64766e6c6b6e7364766e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":0,"position":{"index":2},"proof":null,"raw_tx":"0x80800000000400ef5ea7208782386d27c37f64e183759952b8113f00000000000000000000000000003e3200015283474320ee6dbad8b9399f4e8750aad496ef4d294481bc08b3a1eb093c6817135724600b9e2d136bf434f78cb22e4958b14f5b1d573d6d2e9953fdb3d92d94030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000011736b64766c736b64766e6c6b6e7364766e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5804686173680200000000086d657461646174610c00000004046e616d650200000011736b64766c736b64766e6c6b6e7364766e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051aef5ea7208782386d27c37f64e183759952b8113f","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST3QNX9S0GY13GV97RDZP9RC3EPCN5E0H7WZDCEVW","success":true},"operations":[],"transaction_identifier":{"hash":"0x7285fe9d057fdcd68b47984107aa277687711c154cb478c15650032d846f0c27"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x7b21d82a4e6a777260287dcfac760b8bae75a974c2b3fcd7139c221c4c9470cc","index":106951},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000010ecfad52ee097a7245d421e15e470a8f4ede85fd897e91a6b","index":2432500},"confirm_microblock_identifier":{"hash":"0x30169877b06d233b41246a6fd688260995005296c3497e24eea6ae8aa2eb025f","index":3},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":949,"stacks_block_hash":"0xba50aa9b4a43cb2e735fdc2131f916e387c173eec6ec10b2707583f200e48e1b"},"parent_block_identifier":{"hash":"0x4e8817e05011e4156e22161300c723c52227197d3c43f75e3f9373375b702fbd","index":106950},"timestamp":1683887813,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x616b736a6362616b6a736263616a6b736263)","execution_cost":{"read_count":16,"read_length":44034,"runtime":167413,"write_count":2,"write_length":169},"fee":57049,"kind":{"data":{"args":["0x627463","0x616b736a6362616b6a736263616a6b736263"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":7,"position":{"index":3},"proof":null,"raw_tx":"0x80800000000400c5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca0000000000000007000000000000ded90000e8fc8490287df17c37cf1fb3eadc7b1df15bfc6119679d552c279f71383c28e8100caf6b73faee63e60b88da3c0607705abbaeb3d37d2a22dd5abcb15cfe2d82030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000012616b736a6362616b6a736263616a6b736263","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c5904686173680200000000086d657461646174610c00000004046e616d650200000012616b736a6362616b6a736263616a6b736263096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051ac5f54eaa50c31a29cb4cb00a57a2f3c9ac0f2eca","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST32ZAKNAA31HMAEB9JR0MNX2YF4TR3SESBE4HWDV","success":true},"operations":[],"transaction_identifier":{"hash":"0xa60f0020cd642490a7a8c41a736321a81703bb61d65c2894522bae554ec11918"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x844e68b8d826c3d87526768c197a3b71dd93c5bc67bbadc2d71aa2cb34e549dd","index":106971},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000093c24ced0708d7e38175a1bf68d7e7c89065682189f58ab183e","index":2432533},"confirm_microblock_identifier":{"hash":"0x7bc11e931c110bb96c0ea0753d50c17d7b1260367d54e891218a7b1597d09cc9","index":3},"pox_cycle_index":411,"pox_cycle_length":1050,"pox_cycle_position":982,"stacks_block_hash":"0x4e46f4707b5882656efa80169e5da4f58c56315a6c052329a452d84723f9453c"},"parent_block_identifier":{"hash":"0x8c64dab90f0c64a7cc99fcb8525c500f9e5dcc103fd077230bc0aea2a7d32448","index":106970},"timestamp":1683911077,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x746f6f6c746970)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":20247,"kind":{"data":{"args":["0x627463","0x746f6f6c746970"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":19,"position":{"index":2},"proof":null,"raw_tx":"0x8080000000040083104514eb98328ce0d822680a1d78cc617379d300000000000000130000000000004f17000112800f7a55e8d39b79d2e27fc595cae355ff39fdb9440765cf459ad450717d9b79379624f43ae36535e2b0206d9c3b096f76c3514dd6f657e029d12cb9130f75030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b650000000202000000036274630200000007746f6f6c746970","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c6204686173680200000000086d657461646174610c00000004046e616d650200000007746f6f6c746970096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a83104514eb98328ce0d822680a1d78cc617379d3","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST21H0H8MXEC35370V0H6G2GXF3662WVSTFVSSJDM","success":true},"operations":[],"transaction_identifier":{"hash":"0x2f068add33c01f5031b3b9633b386749f1b3e691dcc00fdbe0d45e778b63f4d6"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x0aefeeba88a8de883251e60e9992f55918de571ade4e6e62e3498a23d99571f8","index":111708},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000001abd482a0018f65e44731b0f6781d876c01a63409e1359a2d5","index":2441322},"confirm_microblock_identifier":{"hash":"0x68bcd7fa5d8a6189adff8585d12b2ab7da89191aaa1b6daf2e1a8ae53a6ac7bb","index":3},"pox_cycle_index":420,"pox_cycle_length":1050,"pox_cycle_position":321,"stacks_block_hash":"0x5650d07988e1b7b8b5cf6e7357a17aa122f2db0ddbaf4c1697be4fcb7d0807a7"},"parent_block_identifier":{"hash":"0x703968d5d2a6c8e65e2d8a0be12647f7b9e6c7838371cdf022c082f75d8bc726","index":111707},"timestamp":1689058186,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x6b6a6c)","execution_cost":{"read_count":16,"read_length":43989,"runtime":166648,"write_count":2,"write_length":154},"fee":1714296,"kind":{"data":{"args":["0x627463","0x6b6a6c"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":41,"position":{"index":75},"proof":null,"raw_tx":"0x808000000004006eae96ccc5f772aea645fd31ec4101cddcb08822000000000000002900000000001a28780000b63f1f684c9c78bc0cfff828449795c6cda2ebc54eebb739e0baa50ce5492b3a24d6ed0b1ac03dc3dd2c0497fddb93175b713ce090856accae2edd82f312712c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b6500000002020000000362746302000000036b6a6c","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c8c04686173680200000000086d657461646174610c00000004046e616d6502000000036b6a6c096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a6eae96ccc5f772aea645fd31ec4101cddcb08822","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1QAX5PCRQVQ5BN68QYK3V21076XSC484AA9ME7P","success":true},"operations":[],"transaction_identifier":{"hash":"0xf46b12e6d921802b255ba1a4e48f50bbf00f3477ef78929431a10101b3808215"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x3808f2b46ce4a47dca679ebd8f501882f7d53538935970a8b6f68916dcb9560c","index":111714},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000023fd956e6d7085bacec0dd0b16dd8bcd4ddb39414f4f20ebe8","index":2441330},"confirm_microblock_identifier":{"hash":"0xce92bbf5b564542150ea8d20bb301f5c4021642f249b55fbd49c5a46fb78d3d6","index":3},"pox_cycle_index":420,"pox_cycle_length":1050,"pox_cycle_position":329,"stacks_block_hash":"0x1561e216e11ea043d56c08a92149992afea87bfe842832a2c2ca1e5ccc3581d8"},"parent_block_identifier":{"hash":"0x7d1fe1e0121e80454131d57f2be6e87bc7d969bd0a4b64fcd00a51713cfa9371","index":111713},"timestamp":1689062395,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x72727272727272)","execution_cost":{"read_count":16,"read_length":44001,"runtime":166852,"write_count":2,"write_length":158},"fee":411080,"kind":{"data":{"args":["0x627463","0x72727272727272"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":16,"position":{"index":337},"proof":null,"raw_tx":"0x8080000000040065a21f6c2fe4aede58afa9760e32988d5ef09659000000000000001000000000000645c80000b51f60a1abd81b986894e671f25123f91e536c4446d5093fd66087d6806c536147a9b4165c1ab049eae8695930710d4a8bca8ab786d1c8fd309950ae27fabe8c030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000772727272727272","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c8d04686173680200000000086d657461646174610c00000004046e616d65020000000772727272727272096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a65a21f6c2fe4aede58afa9760e32988d5ef09659","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"ST1JT47VC5ZJAXQJRNYMQC3HJK26NXW4PB5VA0GMF","success":true},"operations":[],"transaction_identifier":{"hash":"0xbfef8fdd5e9ff200472eb66abce71f8c002b81bd0557e3fe722ccec17624e15f"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} +{"apply":[{"block_identifier":{"hash":"0x525eadcf976a3fe9132351a2bdf64529ab91ca685506fd2268aebb6ccdbd0a81","index":113507},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x0000000000000023e2a2635ff8e2467b18e26dd4e6a161bd909278ab4183f236","index":2443361},"confirm_microblock_identifier":{"hash":"0x73835531e58b34799f7d9e1fb74fa3cf709abba1662d69a1329de3c7fbc6c2f1","index":3},"pox_cycle_index":422,"pox_cycle_length":1050,"pox_cycle_position":260,"stacks_block_hash":"0x709606a72667f998f325667161b8b28517f82a25988f62226e16fbafba1b8da0"},"parent_block_identifier":{"hash":"0x6e7ef392e1327fc38411d301d06d9e94c378755300921ee97633f5034473dbb7","index":113506},"timestamp":1690122313,"transactions":[{"metadata":{"description":"invoked: ST000000000000000000002AMW42H.bns::name-revoke(0x627463, 0x64656c657465646f6d61696e)","execution_cost":{"read_count":16,"read_length":44016,"runtime":167107,"write_count":2,"write_length":163},"fee":2000000,"kind":{"data":{"args":["0x627463","0x64656c657465646f6d61696e"],"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"type":"ContractCall"},"nonce":1,"position":{"index":14},"proof":null,"raw_tx":"0x808000000004002ce98a2a05fca6799a8c7df2569742000ce92bc9000000000000000100000000001e84800001e9fa22998d98d330def5d0fa30936a80e3160eefc4251f5bcb313d7b6dba1a4c4dd3fbd201b39cb504613db57bb629633e0611efecaa94ab8e55359bdc9617eb030200000000021a000000000000000000000000000000000000000003626e730b6e616d652d7265766f6b65000000020200000003627463020000000c64656c657465646f6d61696e","receipt":{"contract_calls_stack":[],"events":[{"data":{"contract_identifier":"ST000000000000000000002AMW42H.bns","raw_value":"0x0c000000010a6174746163686d656e740c00000003106174746163686d656e742d696e6465780100000000000000000000000000000c9904686173680200000000086d657461646174610c00000004046e616d65020000000c64656c657465646f6d61696e096e616d6573706163650200000003627463026f700d0000000b6e616d652d7265766f6b650974782d73656e646572051a2ce98a2a05fca6799a8c7df2569742000ce92bc9","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":[],"mutated_contracts_radius":["ST000000000000000000002AMW42H.bns"]},"result":"(ok true)","sender":"STPEK2HA0QYACYCTHHYZ4NMQ8800ST9BS4F3CE2Z","success":true},"operations":[],"transaction_identifier":{"hash":"0x19cb213406c30dded17ca9d1117800749df3fca3647f14da4fba1443e6263d17"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke","scope":"contract_call"},"uuid":"0dcfe481-ef9e-40f7-ad7b-1a9a39895516"},"rollback":[]} diff --git a/automate/script/stacks-predicates/contract-call/contract-call-file.json b/tests/stacks-predicates/contract-call/contract-call-file.json similarity index 94% rename from automate/script/stacks-predicates/contract-call/contract-call-file.json rename to tests/stacks-predicates/contract-call/contract-call-file.json index 66c3a724e..9d655e5a5 100644 --- a/automate/script/stacks-predicates/contract-call/contract-call-file.json +++ b/tests/stacks-predicates/contract-call/contract-call-file.json @@ -14,9 +14,9 @@ }, "then_that": { "file_append": { - "path": "script/stacks-predicates/contract-call/contract-call-file.result.json" + "path": "script/stacks-predicates/contract-call/contract-call-file-result.json" } } } } -} \ No newline at end of file +} diff --git a/automate/script/stacks-predicates/contract-call/contract-call-post.json b/tests/stacks-predicates/contract-call/contract-call-post.json similarity index 100% rename from automate/script/stacks-predicates/contract-call/contract-call-post.json rename to tests/stacks-predicates/contract-call/contract-call-post.json From bb5e2a967364d65517af86c3303bc6615de88b41 Mon Sep 17 00:00:00 2001 From: timstackblock <49165468+timstackblock@users.noreply.github.com> Date: Tue, 1 Aug 2023 09:54:54 -0400 Subject: [PATCH 06/99] chore: update test --- automate/readme.md | 4 ++-- .../stacks-predicates/contract-call/contract-call-file.json | 4 ++-- .../stacks-predicates/contract-call/contract-call-post.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/automate/readme.md b/automate/readme.md index 524b9e371..b4233b1af 100644 --- a/automate/readme.md +++ b/automate/readme.md @@ -10,7 +10,7 @@ automate-chainhooks is a npm script for automation testing of [chainhook](https: ### Run script 1. Go to the root of the project and do `npm install`. Make sure you have satisfied the above Prerequisites. -2. Start ngrok using the command `ngrok http 3006`. Once it starts, provide the ngrok URL in the `.env` file for `DOMAIN_URL`. This is required to post the result for the http predicates. You can check the ngrok requests at `localhost:4040` +2. Start ngrok using the command `ngrok http 3006`. Once it starts, copy the ngrok URL into the `.env` file for `DOMAIN_URL`. This is required to post the result for the http predicates example of the ngrok URL https://1f67-37-19-198-81.ngrok.io/. You can check the ngrok requests at `localhost:4040` 3. Run all the predicates: ```sh $ npm run predicates @@ -50,4 +50,4 @@ automate-chainhooks is a npm script for automation testing of [chainhook](https: ### Bitcoin -Run the bitcoind with `./bitcoind -rpcuser=root -rpcpassword=root`. Set this user and root in `Chainhook.toml` file and run the command as `chainhook predicates scan /home/user/tests/stacks-predicates/transaction/transaction-bitcoin-file.json --config-path=./Chainhook.toml` \ No newline at end of file +Run the bitcoind with `./bitcoind -rpcuser=root -rpcpassword=root`. Set this user and root in `Chainhook.toml` file and run the command as `chainhook predicates scan /home/user/tests/stacks-predicates/transaction/transaction-bitcoin-file.json --config-path=./Chainhook.toml` diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-file.json b/automate/tests/stacks-predicates/contract-call/contract-call-file.json index afd594ce6..d35d0d8c1 100644 --- a/automate/tests/stacks-predicates/contract-call/contract-call-file.json +++ b/automate/tests/stacks-predicates/contract-call/contract-call-file.json @@ -5,8 +5,8 @@ "version": 1, "networks": { "testnet": { - "start_block": 111779, - "end_block": 111781, + "start_block": 113505, + "end_block": 113509, "expire_after_occurrence": 1, "if_this": { "scope": "contract_call", diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-post.json b/automate/tests/stacks-predicates/contract-call/contract-call-post.json index e641856ed..dcf65e5da 100644 --- a/automate/tests/stacks-predicates/contract-call/contract-call-post.json +++ b/automate/tests/stacks-predicates/contract-call/contract-call-post.json @@ -1 +1 @@ -{"chain":"stacks","uuid":"35ed0323-7549-41ee-a546-ab00d453a681","name":"Contract Call Post","version":1,"networks":{"testnet":{"start_block":111779,"end_block":111781,"expire_after_occurrence":1,"if_this":{"scope":"contract_call","contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"then_that":{"http_post":{"url":"https://a738-2405-201-200a-3191-40d5-db02-efa-357.ngrok.io","authorization_header":""}}}}} \ No newline at end of file +{"chain":"stacks","uuid":"35ed0323-7549-41ee-a546-ab00d453a681","name":"Contract Call Post","version":1,"networks":{"testnet":{"start_block":113505,"end_block":113509,"expire_after_occurrence":1,"if_this":{"scope":"contract_call","contract_identifier":"ST000000000000000000002AMW42H.bns","method":"name-revoke"},"then_that":{"http_post":{"url":"https://a738-2405-201-200a-3191-40d5-db02-efa-357.ngrok.io","authorization_header":""}}}}} From 2ee62048a95d9d356ac46bf2ba8e4d02bb0ed3a2 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Thu, 3 Aug 2023 16:49:09 +0200 Subject: [PATCH 07/99] chore: re-qualify error --- components/chainhook-sdk/src/utils/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/chainhook-sdk/src/utils/mod.rs b/components/chainhook-sdk/src/utils/mod.rs index c14e695ec..22167c1d1 100644 --- a/components/chainhook-sdk/src/utils/mod.rs +++ b/components/chainhook-sdk/src/utils/mod.rs @@ -185,7 +185,7 @@ pub async fn send_request( } if retry >= attempts_max { ctx.try_log(|logger| { - slog::error!(logger, "unable to send request after several retries") + slog::warn!(logger, "unable to send request after several retries") }); return Err(()); } From 65c0176b4c6622cfbaa6541a1846031b7bc2643b Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 4 Aug 2023 21:26:56 +0200 Subject: [PATCH 08/99] chore: requalify log --- components/chainhook-cli/src/service/runloops.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/chainhook-cli/src/service/runloops.rs b/components/chainhook-cli/src/service/runloops.rs index ad67d0c45..0d1882dae 100644 --- a/components/chainhook-cli/src/service/runloops.rs +++ b/components/chainhook-cli/src/service/runloops.rs @@ -57,7 +57,7 @@ pub fn start_stacks_scan_runloop( let last_block_scanned = match res { Ok(last_block_scanned) => last_block_scanned, Err(e) => { - error!( + warn!( moved_ctx.expect_logger(), "Unable to evaluate predicate on Stacks chainstate: {e}", ); From 603db3a2fb86dec3f194b20623a333ba30104fc4 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 4 Aug 2023 21:34:32 +0200 Subject: [PATCH 09/99] chore: cargo fmt --- .../chainhook-sdk/src/chainhooks/tests/mod.rs | 199 +++++++++++------- .../indexer/tests/helpers/stacks_shapes.rs | 2 +- 2 files changed, 122 insertions(+), 79 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/tests/mod.rs b/components/chainhook-sdk/src/chainhooks/tests/mod.rs index 4c823931f..82e2cb2b7 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/tests/mod.rs @@ -3,15 +3,29 @@ use std::collections::HashMap; use self::fixtures::get_all_event_types; use super::{ - stacks::{evaluate_stacks_chainhooks_on_chain_event, StacksTriggerChainhook, handle_stacks_hook_action, StacksChainhookOccurrence}, - types::{StacksChainhookSpecification, StacksPrintEventBasedPredicate, StacksNftEventBasedPredicate, StacksFtEventBasedPredicate,StacksContractCallBasedPredicate,StacksContractDeploymentPredicate, ExactMatchingRule, FileHook, StacksTrait}, + stacks::{ + evaluate_stacks_chainhooks_on_chain_event, handle_stacks_hook_action, + StacksChainhookOccurrence, StacksTriggerChainhook, + }, + types::{ + ExactMatchingRule, FileHook, StacksChainhookSpecification, + StacksContractCallBasedPredicate, StacksContractDeploymentPredicate, + StacksFtEventBasedPredicate, StacksNftEventBasedPredicate, StacksPrintEventBasedPredicate, + StacksTrait, + }, }; -use crate::{chainhooks::{types::{HookAction, StacksPredicate, StacksStxEventBasedPredicate,}, tests::fixtures::{get_expected_occurrence, get_test_event_by_type}}, utils::AbstractStacksBlock}; use crate::utils::Context; -use chainhook_types::{StacksNetwork, StacksTransactionEvent, StacksTransactionData}; +use crate::{ + chainhooks::{ + tests::fixtures::{get_expected_occurrence, get_test_event_by_type}, + types::{HookAction, StacksPredicate, StacksStxEventBasedPredicate}, + }, + utils::AbstractStacksBlock, +}; use chainhook_types::{StacksBlockUpdate, StacksChainEvent, StacksChainUpdatedWithBlocksData}; -use test_case::test_case; +use chainhook_types::{StacksNetwork, StacksTransactionData, StacksTransactionEvent}; use serde_json::Value as JsonValue; +use test_case::test_case; pub mod fixtures; @@ -88,7 +102,6 @@ pub mod fixtures; 0; "FtEvent predicates don't match if missing event" )] - // NftEvent predicate tests #[test_case( vec![vec![get_test_event_by_type("nft_mint")]], @@ -211,7 +224,6 @@ pub mod fixtures; 0; "StxEvent predicates don't match if missing event" )] - // PrintEvent predicate tests #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], @@ -236,17 +248,17 @@ pub mod fixtures; StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { contract_identifier: "wront-id".to_string(), contains: "some-value".to_string(), - }), + }), 0; "PrintEvent predicate rejects non matching contract_identifier" )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { - contract_identifier: + contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "wrong-value".to_string(), - }), + }), 0; "PrintEvent predicate rejects non matching contains value" )] @@ -255,7 +267,7 @@ pub mod fixtures; StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { contract_identifier: "*".to_string(), contains: "some-value".to_string(), - }), + }), 1; "PrintEvent predicate contract_identifier wildcard checks all print events for match" )] @@ -264,7 +276,7 @@ pub mod fixtures; StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "*".to_string(), - }), + }), 1; "PrintEvent predicate contains wildcard matches all values for matching events" )] @@ -273,17 +285,24 @@ pub mod fixtures; StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { contract_identifier: "*".to_string(), contains: "*".to_string(), - }), + }), 2; "PrintEvent predicate contract_identifier wildcard and contains wildcard matches all values on all print events" )] -fn test_stacks_predicates(blocks_with_events: Vec>, predicate: StacksPredicate, expected_applies: u64) { +fn test_stacks_predicates( + blocks_with_events: Vec>, + predicate: StacksPredicate, + expected_applies: u64, +) { // Prepare block - let new_blocks = blocks_with_events.iter().map(|events| StacksBlockUpdate { - block: fixtures::build_stacks_testnet_block_from_smart_contract_event_data(events), - parent_microblocks_to_apply: vec![], - parent_microblocks_to_rollback: vec![], - }).collect(); + let new_blocks = blocks_with_events + .iter() + .map(|events| StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_from_smart_contract_event_data(events), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }) + .collect(); let event = StacksChainEvent::ChainUpdatedWithBlocks(StacksChainUpdatedWithBlocksData { new_blocks, confirmed_blocks: vec![], @@ -312,55 +331,56 @@ fn test_stacks_predicates(blocks_with_events: Vec>, if expected_applies == 0 { assert_eq!(triggered.len(), 0) - } - else { + } else { let actual_applies: u64 = triggered[0].apply.len().try_into().unwrap(); assert_eq!(actual_applies, expected_applies); } } - #[test_case( StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9".to_string())), 1; "Deployer predicate matches by contract deployer" )] #[test_case( - StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("*".to_string())), + StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("*".to_string())), 1; "Deployer predicate wildcard deployer catches all occurences" )] #[test_case( - StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("wrong-deployer".to_string())), + StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("wrong-deployer".to_string())), 0; "Deployer predicate does not match non-matching deployer" )] #[test_case( - StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Sip09)), + StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Sip09)), 0; "ImplementSip predicate returns no values for Sip09" )] #[test_case( - StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Sip10)), + StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Sip10)), 0; "ImplementSip predicate returns no values for Sip10" )] #[test_case( - StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Any)), + StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::ImplementTrait(StacksTrait::Any)), 0; "ImplementSip predicate returns no values for Any" )] fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_applies: u64) { // Prepare block - let new_blocks = vec![StacksBlockUpdate { - block: fixtures::build_stacks_testnet_block_with_contract_deployment(), - parent_microblocks_to_apply: vec![], - parent_microblocks_to_rollback: vec![], - }, StacksBlockUpdate { - block: fixtures::build_stacks_testnet_block_with_contract_call(), - parent_microblocks_to_apply: vec![], - parent_microblocks_to_rollback: vec![], - }]; + let new_blocks = vec![ + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_deployment(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_call(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + ]; let event = StacksChainEvent::ChainUpdatedWithBlocks(StacksChainUpdatedWithBlocksData { new_blocks, confirmed_blocks: vec![], @@ -389,11 +409,9 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap if expected_applies == 0 { assert_eq!(triggered.len(), 0) - } - else if triggered.len() == 0 { + } else if triggered.len() == 0 { panic!("expected more than one block to be applied, but no predicates were triggered") - } - else { + } else { let actual_applies: u64 = triggered[0].apply.len().try_into().unwrap(); assert_eq!(actual_applies, expected_applies); } @@ -403,7 +421,7 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1".to_string(), method: "commit-block".to_string() - }), + }), 1; "ContractCall predicate matches by contract identifier and method" )] @@ -411,7 +429,7 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1".to_string(), method: "wrong-method".to_string() - }), + }), 0; "ContractCall predicate does not match for wrong method" )] @@ -419,7 +437,7 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: "wrong-id".to_string(), method: "commit-block".to_string() - }), + }), 0; "ContractCall predicate does not match for wrong contract identifier" )] @@ -435,15 +453,18 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap )] fn test_stacks_predicate_contract_call(predicate: StacksPredicate, expected_applies: u64) { // Prepare block - let new_blocks = vec![StacksBlockUpdate { - block: fixtures::build_stacks_testnet_block_with_contract_call(), - parent_microblocks_to_apply: vec![], - parent_microblocks_to_rollback: vec![], - },StacksBlockUpdate { - block: fixtures::build_stacks_testnet_block_with_contract_deployment(), - parent_microblocks_to_apply: vec![], - parent_microblocks_to_rollback: vec![], - }]; + let new_blocks = vec![ + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_call(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_deployment(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + ]; let event = StacksChainEvent::ChainUpdatedWithBlocks(StacksChainUpdatedWithBlocksData { new_blocks, confirmed_blocks: vec![], @@ -472,11 +493,9 @@ fn test_stacks_predicate_contract_call(predicate: StacksPredicate, expected_appl if expected_applies == 0 { assert_eq!(triggered.len(), 0) - } - else if triggered.len() == 0 { + } else if triggered.len() == 0 { panic!("expected more than one block to be applied, but no predicates were triggered") - } - else { + } else { let actual_applies: u64 = triggered[0].apply.len().try_into().unwrap(); assert_eq!(actual_applies, expected_applies); } @@ -496,40 +515,48 @@ fn test_stacks_hook_action_noop() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - predicate: StacksPredicate::Txid(ExactMatchingRule::Equals("0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string())), + predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( + "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), + )), action: HookAction::Noop, enabled: true, }; - let apply_block_data = fixtures::build_stacks_testnet_block_with_contract_call(); - let apply_transactions = apply_block_data.transactions.iter().map(|t|t).collect(); + let apply_transactions = apply_block_data.transactions.iter().map(|t| t).collect(); let apply_blocks: &dyn AbstractStacksBlock = &apply_block_data; let rollback_block_data = fixtures::build_stacks_testnet_block_with_contract_deployment(); - let rollback_transactions = rollback_block_data.transactions.iter().map(|t|t).collect(); + let rollback_transactions = rollback_block_data.transactions.iter().map(|t| t).collect(); let rollback_blocks: &dyn AbstractStacksBlock = &apply_block_data; let trigger = StacksTriggerChainhook { chainhook: &chainhook, apply: vec![(apply_transactions, apply_blocks)], - rollback: vec![(rollback_transactions, rollback_blocks)] + rollback: vec![(rollback_transactions, rollback_blocks)], }; let proofs = HashMap::new(); - let ctx = Context { logger: None, tracer: false }; + let ctx = Context { + logger: None, + tracer: false, + }; let occurrence = handle_stacks_hook_action(trigger, &proofs, &ctx).unwrap(); if let StacksChainhookOccurrence::Data(data) = occurrence { assert_eq!(data.apply.len(), 1); - assert_eq!(data.apply[0].block_identifier.hash, apply_block_data.block_identifier.hash); + assert_eq!( + data.apply[0].block_identifier.hash, + apply_block_data.block_identifier.hash + ); assert_eq!(data.rollback.len(), 1); - assert_eq!(data.rollback[0].block_identifier.hash, rollback_block_data.block_identifier.hash); - } - else { + assert_eq!( + data.rollback[0].block_identifier.hash, + rollback_block_data.block_identifier.hash + ); + } else { panic!("wrong occurrence type"); } } - #[test] fn test_stacks_hook_action_file_append() { let chainhook = StacksChainhookSpecification { @@ -544,30 +571,47 @@ fn test_stacks_hook_action_file_append() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: Some(true), - predicate: StacksPredicate::Txid(ExactMatchingRule::Equals("0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string())), - action: HookAction::FileAppend(FileHook {path: "./".to_string()}), + predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( + "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), + )), + action: HookAction::FileAppend(FileHook { + path: "./".to_string(), + }), enabled: true, }; let events = get_all_event_types(); let mut apply_blocks = vec![]; for event in events.iter() { - apply_blocks.push(fixtures::build_stacks_testnet_block_from_smart_contract_event_data(&vec![event.to_owned()])); - + apply_blocks.push( + fixtures::build_stacks_testnet_block_from_smart_contract_event_data(&vec![ + event.to_owned() + ]), + ); } - let apply: Vec<(Vec<&StacksTransactionData>, &dyn AbstractStacksBlock)> = apply_blocks.iter().map(|b| (b.transactions.iter().map(|t| t).collect(), b as &dyn AbstractStacksBlock)).collect(); - + let apply: Vec<(Vec<&StacksTransactionData>, &dyn AbstractStacksBlock)> = apply_blocks + .iter() + .map(|b| { + ( + b.transactions.iter().map(|t| t).collect(), + b as &dyn AbstractStacksBlock, + ) + }) + .collect(); let rollback_block_data = fixtures::build_stacks_testnet_block_with_contract_deployment(); - let rollback_transactions = rollback_block_data.transactions.iter().map(|t|t).collect(); + let rollback_transactions = rollback_block_data.transactions.iter().map(|t| t).collect(); let rollback_block: &dyn AbstractStacksBlock = &rollback_block_data; let trigger = StacksTriggerChainhook { chainhook: &chainhook, apply: apply, - rollback: vec![(rollback_transactions, rollback_block)] + rollback: vec![(rollback_transactions, rollback_block)], }; let proofs = HashMap::new(); - let ctx = Context { logger: None, tracer: false }; + let ctx = Context { + logger: None, + tracer: false, + }; let occurrence = handle_stacks_hook_action(trigger, &proofs, &ctx).unwrap(); if let StacksChainhookOccurrence::File(path, bytes) = occurrence { assert_eq!(path, "./".to_string()); @@ -576,8 +620,7 @@ fn test_stacks_hook_action_file_append() { let actual = serde_json::to_string_pretty(obj).unwrap(); let expected = get_expected_occurrence(); assert_eq!(expected, actual); - } - else { + } else { panic!("wrong occurence type"); } } diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/stacks_shapes.rs b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_shapes.rs index c0f79f9d9..316849128 100644 --- a/components/chainhook-sdk/src/indexer/tests/helpers/stacks_shapes.rs +++ b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_shapes.rs @@ -3721,7 +3721,7 @@ pub fn get_vector_051() -> Vec<(BlockEvent, StacksChainEventExpectation)> { /// Vector 052: Generate the following blocks /// /// [a1](1) - [b1](2) - B1(3) -/// +/// /// pub fn get_vector_052() -> Vec<(BlockEvent, StacksChainEventExpectation)> { vec![ From dad6d2bd0e448dac4cf52d5f2df68efc100b85e1 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 4 Aug 2023 21:35:03 +0200 Subject: [PATCH 10/99] chore: remove curse related schemas --- .../src/chainhooks/bitcoin/mod.rs | 1 - components/chainhook-types-rs/src/rosetta.rs | 1 - .../typescript/src/schemas/bitcoin/payload.ts | 24 +------------------ 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index 137d55aee..1e971bebd 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -423,7 +423,6 @@ impl BitcoinPredicateType { for op in tx.metadata.ordinal_operations.iter() { match op { OrdinalOperation::InscriptionRevealed(_) - | OrdinalOperation::CursedInscriptionRevealed(_) | OrdinalOperation::InscriptionTransferred(_) => return true, } } diff --git a/components/chainhook-types-rs/src/rosetta.rs b/components/chainhook-types-rs/src/rosetta.rs index a90fe92f7..f779e5025 100644 --- a/components/chainhook-types-rs/src/rosetta.rs +++ b/components/chainhook-types-rs/src/rosetta.rs @@ -305,7 +305,6 @@ pub struct BitcoinTransactionMetadata { #[serde(rename_all = "snake_case")] pub enum OrdinalOperation { InscriptionRevealed(OrdinalInscriptionRevealData), - CursedInscriptionRevealed(OrdinalInscriptionRevealData), InscriptionTransferred(OrdinalInscriptionTransferData), } diff --git a/components/client/typescript/src/schemas/bitcoin/payload.ts b/components/client/typescript/src/schemas/bitcoin/payload.ts index 35f4cc98f..cc6e184dd 100644 --- a/components/client/typescript/src/schemas/bitcoin/payload.ts +++ b/components/client/typescript/src/schemas/bitcoin/payload.ts @@ -21,6 +21,7 @@ export const BitcoinInscriptionRevealedSchema = Type.Object({ ordinal_offset: Type.Integer(), satpoint_post_inscription: Type.String(), transfers_pre_inscription: Type.Integer(), + curse_type: Nullable(Type.Any()), tx_index: Type.Integer(), }); export type BitcoinInscriptionRevealed = Static; @@ -35,30 +36,7 @@ export const BitcoinInscriptionTransferredSchema = Type.Object({ }); export type BitcoinInscriptionTransferred = Static; -export const BitcoinCursedInscriptionRevealedSchema = Type.Object({ - content_bytes: Type.String(), - content_type: Type.String(), - content_length: Type.Integer(), - inscription_number: Type.Integer(), - inscription_fee: Type.Integer(), - inscription_id: Type.String(), - inscription_output_value: Type.Integer(), - inscription_input_index: Type.Integer(), - inscriber_address: Nullable(Type.String()), - ordinal_number: Type.Integer(), - ordinal_block_height: Type.Integer(), - ordinal_offset: Type.Integer(), - satpoint_post_inscription: Type.String(), - transfers_pre_inscription: Type.Integer(), - curse_type: Nullable(Type.Any()), - tx_index: Type.Integer(), -}); -export type BitcoinCursedInscriptionRevealed = Static< - typeof BitcoinCursedInscriptionRevealedSchema ->; - export const BitcoinOrdinalOperationSchema = Type.Object({ - cursed_inscription_revealed: Type.Optional(BitcoinCursedInscriptionRevealedSchema), inscription_revealed: Type.Optional(BitcoinInscriptionRevealedSchema), inscription_transferred: Type.Optional(BitcoinInscriptionTransferredSchema), }); From 6b58e52889db487dfd8919c940152fdb63156179 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 4 Aug 2023 21:37:19 +0200 Subject: [PATCH 11/99] chore: update crates --- components/chainhook-cli/Cargo.toml | 2 +- components/chainhook-sdk/Cargo.toml | 4 ++-- components/chainhook-types-rs/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index e56ef044f..47f168d74 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -17,7 +17,7 @@ hex = "0.4.3" rand = "0.8.5" # tikv-client = { git = "https://github.com/tikv/client-rust.git", rev = "8f54e6114227718e256027df2577bbacdf425f86" } # raft-proto = { git = "https://github.com/tikv/raft-rs", rev="f73766712a538c2f6eb135b455297ad6c03fc58d", version = "0.7.0"} -chainhook-sdk = { version = "0.8.0", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.8.1", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 954c2e80a..3ffc46fe8 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.0" +version = "0.8.1" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" @@ -18,7 +18,7 @@ hiro-system-kit = "0.1.0" # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } -chainhook-types = { version = "1.0.9", path = "../chainhook-types-rs" } +chainhook-types = { version = "1.0.10", path = "../chainhook-types-rs" } rocket = { version = "=0.5.0-rc.3", features = ["json"] } bitcoincore-rpc = "0.16.0" bitcoincore-rpc-json = "0.16.0" diff --git a/components/chainhook-types-rs/Cargo.toml b/components/chainhook-types-rs/Cargo.toml index 409f36a1a..1f7337445 100644 --- a/components/chainhook-types-rs/Cargo.toml +++ b/components/chainhook-types-rs/Cargo.toml @@ -2,7 +2,7 @@ name = "chainhook-types" description = "Bitcoin and Stacks data schemas, based on the Rosetta specification" license = "MIT" -version = "1.0.9" +version = "1.0.10" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From aa934d2ffacaf61b55578e48c2e97cf53d070f51 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Fri, 4 Aug 2023 21:43:09 +0200 Subject: [PATCH 12/99] chore: add curse variant --- components/chainhook-cli/Cargo.toml | 4 +--- components/chainhook-sdk/Cargo.toml | 4 ++-- components/chainhook-types-rs/Cargo.toml | 2 +- components/chainhook-types-rs/src/rosetta.rs | 1 + 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 47f168d74..a8d62afe6 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -15,9 +15,7 @@ redis = "0.21.5" serde-redis = "0.12.0" hex = "0.4.3" rand = "0.8.5" -# tikv-client = { git = "https://github.com/tikv/client-rust.git", rev = "8f54e6114227718e256027df2577bbacdf425f86" } -# raft-proto = { git = "https://github.com/tikv/raft-rs", rev="f73766712a538c2f6eb135b455297ad6c03fc58d", version = "0.7.0"} -chainhook-sdk = { version = "0.8.1", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.8.3", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 3ffc46fe8..58c7d201d 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.1" +version = "0.8.2" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" @@ -18,7 +18,7 @@ hiro-system-kit = "0.1.0" # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } -chainhook-types = { version = "1.0.10", path = "../chainhook-types-rs" } +chainhook-types = { version = "1.0.11", path = "../chainhook-types-rs" } rocket = { version = "=0.5.0-rc.3", features = ["json"] } bitcoincore-rpc = "0.16.0" bitcoincore-rpc-json = "0.16.0" diff --git a/components/chainhook-types-rs/Cargo.toml b/components/chainhook-types-rs/Cargo.toml index 1f7337445..d4c97de44 100644 --- a/components/chainhook-types-rs/Cargo.toml +++ b/components/chainhook-types-rs/Cargo.toml @@ -2,7 +2,7 @@ name = "chainhook-types" description = "Bitcoin and Stacks data schemas, based on the Rosetta specification" license = "MIT" -version = "1.0.10" +version = "1.0.11" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/components/chainhook-types-rs/src/rosetta.rs b/components/chainhook-types-rs/src/rosetta.rs index f779e5025..63db84ca4 100644 --- a/components/chainhook-types-rs/src/rosetta.rs +++ b/components/chainhook-types-rs/src/rosetta.rs @@ -324,6 +324,7 @@ pub enum OrdinalInscriptionCurseType { Batch, P2wsh, Reinscription, + Unknown, } #[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] From be828783486fec07b4c826dd7dbfe99511cc8352 Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Thu, 10 Aug 2023 11:55:47 -0500 Subject: [PATCH 13/99] Updated "chainhooks service with bitcoind" doc --- ...n-chainhook-as-a-service-using-bitcoind.md | 234 ++++-------------- 1 file changed, 53 insertions(+), 181 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index b4c9a9f5b..5f9378b02 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -8,12 +8,17 @@ You can run Chainhook as a service to evaluate Bitcoin against your predicates. ### Setting up a Bitcoin Node -Install bitcoind using [this](https://bitcoin.org/en/bitcoin-core/) link. Ingesting blocks using bitcoind happens through zeromq, an embedded networking library in the bitcoind installation package. +Bitcoind is a program that implements the Bitcoin protocol for remote procedure call (RPC) use. Chainhook can be set up to interact with the Bitcoin chainstate through bitcoind's ZeroMQ interface, its embedded networking library. -Bitcoind installation will download binaries in a zip format, `bitcoin-22.0-osx64.tar.gz`. You can extract the zip file to view the folders. Expand the `bin` folder to see the bitcoind executable files. +This guide is written to work with the latest Bitcoin Core software containing bitcoind, [Bitcoin Core 25.0](https://bitcoincore.org/bin/bitcoin-core-25.0/). + +> **_NOTE:_** +> +> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for [bitcoind](https://en.bitcoin.it/wiki/Bitcoind), ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin), or bitcoin.org's [Running A Full Node guide](https://bitcoin.org/en/full-node). - Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the below configuration to the `bitcoin.conf` file. -- Get the downloaded path of the bitcoind from the [prerequisites section](#prerequisites) and use it in the `datadir` configuration below. +- a) if you already have a bitcoin node, or b) you are syncing and starting a node from scratch. +- The Chainhook will scan against bitcoin blockchain data. Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` option. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) - Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below. - Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below. @@ -22,10 +27,12 @@ Bitcoind installation will download binaries in a zip format, `bitcoin-22.0-osx6 > Make a note of the `rpcuser`, `rpcpassword` and `rpcport` values to use them later in the chainhook configuration. ```conf -datadir= +# Bitcoin Core Configuration + +datadir= # Path to your Bitcoin folder server=1 -rpcuser="bitcoind_username" # You can set the username here -rpcpassword="bitcoind_password" # You can set the password here +rpcuser=bitcoind_username # You can set the username here +rpcpassword=bitcoind_password # You can set the password here rpcport=8332 # You can set your localhost port number here rpcallowip=0.0.0.0/0 rpcallowip=::/0 @@ -51,13 +58,13 @@ In the command below, use the path to your `bitcoin.conf` file from your machine > **_NOTE:_** > -> The below command is a startup process that might take a few hours to run. +> The below command is a startup process that, if this is your first time syncing a node, might take a few hours to a few days to run. ```console -./bitcoind -conf=/bitcoin.conf +./bitcoind -conf= ``` -Once the above command runs, you will see `zmq_url` entries in the output, enabling zeromq. +Once the above command runs, you will see `zmq_url` entries in the output, enabling ZeroMQ. ### Configure Chainhook @@ -106,67 +113,65 @@ tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-st In the `Chainhook.toml` file that gets generated, you'll need to match the network parameters to the `bitcoin.config` that was generated earlier in [this](#setting-up-a-bitcoin-node) section to allow Chainhook to connect to the bitcoin layer. -The Bitcoin node is exposing the rpc endpoints. To protect the endpoints, we are using rpc username and password fields. To run Chainhook as a service using Bitcoin, you must match the rpc endpoints username, password, and network ports. +The Bitcoin node is exposing the RPC endpoints. To protect the endpoints, we are using RPC username and password fields. To run Chainhook as a service using Bitcoin, you must match the RPC endpoints username, password, and network ports. As such, some configurations must match Chainhook and the bitcoind node. In the `Chainhook.toml`, update the following network parameters to match the `bitcoin.conf`: -| bitcoin.conf | Chainhook.toml | -| ----------- | ----------- | -| rpcuser | bitcoind_rpc_username | -| rpcpassword | bitcoind_rpc_password | -| rpcport | bitcoind_rpc_url | -| zmqpubhashblock | bitcoind_zmq_url | +| bitcoin.conf | Chainhook.toml | +| --------------- | --------------------- | +| rpcuser | bitcoind_rpc_username | +| rpcpassword | bitcoind_rpc_password | +| rpcport | bitcoind_rpc_url | +| zmqpubhashblock | bitcoind_zmq_url | In the `Chainhook.toml` file, - Update the `bitcoind_rpc_username` to use the username set for `rpcuser` earlier. -- Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. +- Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. - Update the `bitcoind_rpc_url` to use the same host and port for the `rpcport` earlier. - Next, update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. ## Scan blockchain based on predicates -Now that your bitcoind and Chainhook configurations are done, you can scan your blocks by defining your [predicates](../overview.md#if-this-predicate-design). This section helps you with an example JSON file to scan a range of blocks in the blockchain and render the results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). - -The following are the two examples to walk you through `file_append` and `http_post` `then-that` predicate designs. +Now that your bitcoind and Chainhook configurations are done, you can scan your blocks by defining your [predicates](../overview.md#if-this-predicate-design). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). -Example 1 uses the `ordinals.json` file to scan the predicates and render results using `file_append`. -Example 2 uses the `ordinals_protocol.json` to scan the predicates and render results using `http_post`. +The following is an example to walk you through `file_append` `then-that` predicate design. -You can choose between the following examples to scan the predicates. +The example collects bitcoin transactions from a particular address, specifically the bitcoin address associated with a Stacking pool, [Friedgar Pool](https://pool.friedger.de/). This address has been collecting payouts from Stacks miners since cycle 55. We are scanning a portion of the bitcoin blockchain to capture the last few of these payouts (to shorten predicate scanning example). ### Example 1 Run the following command in your terminal to generate a sample JSON file with predicates. ```console -chainhook predicates new ordinals.json --bitcoin +touch stacking.json ``` -A JSON file `ordinals.json` is generated. +Paste the following contents into the `stacking.json` file. ```json { - "uuid": "1", - "name": "Hello Ordinals", - "chain": "bitcoin", - "version": 1, - "networks": { - "testnet": { - "start_block": 777534, - "end_block": 777540, - "if_this": { - "scope": "ordinals_protocol", - "operation": "inscription_feed" - }, - "then_that": { - "file_append": { - "path": "inscription_feed.txt" - } - } + "chain": "bitcoin", + "uuid": "13b3fce6-eace-4552-a2f6-7672cd94cf7e", + "name": "Friedgar's Stacking Pool", + "version": 1, + "networks": { + "mainnet": { + "start_block": 800000, + "end_block": 802000, + "if_this": { + "scope": "outputs", + "p2wpkh": { + "equals": "bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe" + } + }, + "then_that": { + "file_append": { + "path": "btc-transactions.txt" } - + } } + } } ``` @@ -174,156 +179,23 @@ A JSON file `ordinals.json` is generated. > > You can get blockchain height and current block by referring to https://explorer.hiro.so/blocks?chain=mainnet -Now, use the following command to scan the blocks based on the predicates defined in the `ordinals.json` file. +Now, use the following command to scan the blocks based on the predicates defined in the `stacking.json` file. ```console -chainhook predicates scan ordinals.json --config-path=./Chainhook.toml +chainhook predicates scan stacking.json --config-path=./Chainhook.toml ``` -The output of the above command will be a text file `inscription_feed.txt` generated based on the predicate definition. +The output of the above command will be a text file `btc-transactions.txt` generated based on the predicate definition. > **_TIP:_** > > To optimize your experience with scanning, the following are a few knobs you can play with: +> > - Use of adequate values for `start_block` and `end_block` in predicates will drastically improve the performance. > - Reducing the number of network hops between the Chainhook and the bitcoind processes can also help, so your network setup can play a major role in performance. -### Example 2 - -Run the following command to generate a sample JSON file with predicates in your terminal. - -```console -chainhook predicates new ordinals_protocol.json --bitcoin -``` - -A JSON file `ordinals_protocol.json` is generated. You can now edit the JSON based on the available predicates for Bitcoin. To understand the available predicates, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). - -```json -{ - "uuid": "1", - "name": "Hello Ordinals", - "chain": "bitcoin", - "version": 1, - "networks": { - "testnet": { - "if_this": { - "scope": "ordinals_protocol", - "operation": "inscription_feed" - }, - "then_that": { - "http_post": { - "url": "http://localhost:3000/events", - "authorization_header": "123904" - } - }, - "start_block": 777534, - } - - } -} -``` - -> **_NOTE:_** -> -> The `start_block` is the required field to use the `http_post` `then-that` predicate. - -Now, use the following command to scan the blocks based on the predicates defined in the `ordinals_protocol.json` file. - -```console -chainhook predicates scan ordinals_protocol.json --config-path=./Chainhook.toml -``` - -The above command posts events to the URL, `http://localhost:3000/events` mentioned in the JSON file. - -## Initiate Chainhook Service - -In this section, you'll learn how to initiate the chainhook service using the following two ways and use the REST API call to post the events onto a server. - -- Initiate the chainhook service by passing the predicate path to the command as shown below. - - ```console - chainhook service start --predicate-path=ordinals_protocol.json --config-path=Chainhook.toml - ``` - - The above command registers the predicates based on the predicate definition in the `ordinals_protocol.json` file. - -- You can also dynamically register predicates via the predicate registration server. To do this: - - Uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. - ``` - [http_api] - http_port = 20456 - database_uri = "redis://localhost:6379/" - ``` - - Start the Chainhook service by running ```chainhook service start --config-path=Chainhook.toml```. - - Now, the predicate registration server is running at `localhost:20456`. To dynamically register a new predicate, send a POST request to `localhost:20456/v1/chainhooks` with the new predicate, in JSON format, included in the request body. For complete documentation on the API endpoints available, see the [OpenAPI](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) specification. - - ![Example post request](../images/chainhook-post-request.jpeg) - -The sample payload response should look like this: - -```jsonc -{ - "chainhook": { - "predicate": { - "operation": "inscription_feed", - "scope": "ordinals_protocol" - }, - "uuid": "1" - }, - "apply": [{ - "block_identifier": { - "hash": "0x00000000000000000003e3e2ffd3baaff2cddda7d12e84ed0ffe6f7778e988d4", - "index": 777534 - }, - "metadata": {}, - "parent_block_identifier": { - "hash": "0x0000000000000000000463a1034c59e6dc94c7e52855582af11882743b86e2a7", - "index": 777533 - }, - "timestamp": 1676923039, - "transactions": [{ - "transaction_identifier": { - "hash": "0xca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013e" - }, - "metadata": { - "ordinal_operations": [{ - "inscription_revealed": { - "content_bytes": "", - "content_length": 12293, - "content_type": "image/jpeg", - "inscriber_address": "bc1punnjva5ayg84kf5tmvx265uwvp8py3ux24skz43aycj5rzdgzjfq0jxsuc", - "inscription_fee": 64520, - "inscription_id": "ca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013ei0", - "inscription_number": 0, - "inscription_output_value": 10000, - "ordinal_block_height": 543164, - "ordinal_number": 1728956147664701, - "ordinal_offset": 1147664701, - "satpoint_post_inscription": "ca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013e:0:0", - "transfers_pre_inscription": 0 - } - }], - "proof": null - }, - "operations": [] - // Other transactions - }] - }], - "rollback": [], -} -``` - -Understand the output of the above JSON file with the following details. - -- The `apply` payload includes the block header and the transactions that triggered the predicate. - -- The `rollback` payload includes the block header and the transactions that triggered the predicate for a past block that is no longer part of the canonical chain and must be reverted. - -> **_TIP:_** -> -> You can also run chainhook service by passing multiple predicates. -> Example: ```chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml``` ## References - To learn more about Ordinals, refer to [Introducing Ordinals Explorer and Ordinals API](https://www.hiro.so/blog/introducing-the-ordinals-explorer-and-ordinals-api). -- The [OpenAPI specification for chainhook](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) is available to understand the scope of chainhook. +- The [OpenAPI specification for chainhook](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) is available to understand the scope of chainhook. \ No newline at end of file From c44afef2371017c6ad097ae27e13950f859acb91 Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Thu, 10 Aug 2023 12:43:51 -0500 Subject: [PATCH 14/99] Update how-to-run-chainhook-as-a-service-using-bitcoind.md Some typos and language changes. --- ...n-chainhook-as-a-service-using-bitcoind.md | 35 ++++++++----------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index 5f9378b02..e7acd2da4 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -14,11 +14,10 @@ This guide is written to work with the latest Bitcoin Core software containing b > **_NOTE:_** > -> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for [bitcoind](https://en.bitcoin.it/wiki/Bitcoind), ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin), or bitcoin.org's [Running A Full Node guide](https://bitcoin.org/en/full-node). +> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org's [Running A Full Node guide](https://bitcoin.org/en/full-node). - Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the below configuration to the `bitcoin.conf` file. -- a) if you already have a bitcoin node, or b) you are syncing and starting a node from scratch. -- The Chainhook will scan against bitcoin blockchain data. Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` option. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) +- The Chainhook will scan against bitcoin blockchain data. Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` field. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) - Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below. - Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below. @@ -29,10 +28,10 @@ This guide is written to work with the latest Bitcoin Core software containing b ```conf # Bitcoin Core Configuration -datadir= # Path to your Bitcoin folder +datadir= # Path to existing Bitcoin folder. New data directory will be created here otherwise server=1 -rpcuser=bitcoind_username # You can set the username here -rpcpassword=bitcoind_password # You can set the password here +rpcuser=devnet # You can set the username here +rpcpassword=devnet # You can set the password here rpcport=8332 # You can set your localhost port number here rpcallowip=0.0.0.0/0 rpcallowip=::/0 @@ -58,7 +57,7 @@ In the command below, use the path to your `bitcoin.conf` file from your machine > **_NOTE:_** > -> The below command is a startup process that, if this is your first time syncing a node, might take a few hours to a few days to run. +> The below command is a startup process that, if this is your first time syncing a node, might take a few hours to a few days to run. Alternatively, if the directory pointed to in the `datadir` field above contains bitcoin blockchain data, syncing will resume. ```console ./bitcoind -conf= @@ -73,7 +72,7 @@ In this section, you will configure chainhook to match the network configuration Next, you will generate a `Chainhook.toml` file to connect Chainhook with your bitcoind node. Navigate to the directory where you want to generate the `Chainhook.toml` file and use the following command in your terminal: ```console -chainhook config generate --testnet +chainhook config generate --mainnet ``` The following `Chainhook.toml` file should be generated: @@ -111,11 +110,12 @@ tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-st ``` -In the `Chainhook.toml` file that gets generated, you'll need to match the network parameters to the `bitcoin.config` that was generated earlier in [this](#setting-up-a-bitcoin-node) section to allow Chainhook to connect to the bitcoin layer. +Several of the network parameters in the generated `Chainhook.toml` configuration file need to match the network parameters contained in the `bitcoin.conf` that was created earlier in the [Setting up a Bitcoin Node](#setting-up-a-bitcoin-node) section: -The Bitcoin node is exposing the RPC endpoints. To protect the endpoints, we are using RPC username and password fields. To run Chainhook as a service using Bitcoin, you must match the RPC endpoints username, password, and network ports. - -As such, some configurations must match Chainhook and the bitcoind node. In the `Chainhook.toml`, update the following network parameters to match the `bitcoin.conf`: +- Update the `bitcoind_rpc_username` to use the username set for `rpcuser` earlier. +- Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. +- Update the `bitcoind_rpc_url` to use the same host and port for the `rpcport` earlier. +- Next, update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. | bitcoin.conf | Chainhook.toml | | --------------- | --------------------- | @@ -124,20 +124,15 @@ As such, some configurations must match Chainhook and the bitcoind node. In the | rpcport | bitcoind_rpc_url | | zmqpubhashblock | bitcoind_zmq_url | -In the `Chainhook.toml` file, -- Update the `bitcoind_rpc_username` to use the username set for `rpcuser` earlier. -- Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. -- Update the `bitcoind_rpc_url` to use the same host and port for the `rpcport` earlier. -- Next, update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. ## Scan blockchain based on predicates -Now that your bitcoind and Chainhook configurations are done, you can scan your blocks by defining your [predicates](../overview.md#if-this-predicate-design). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). +Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger an action. This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). The following is an example to walk you through `file_append` `then-that` predicate design. -The example collects bitcoin transactions from a particular address, specifically the bitcoin address associated with a Stacking pool, [Friedgar Pool](https://pool.friedger.de/). This address has been collecting payouts from Stacks miners since cycle 55. We are scanning a portion of the bitcoin blockchain to capture the last few of these payouts (to shorten predicate scanning example). +The example collects bitcoin transactions from a particular address, specifically the bitcoin address associated with a Stacking pool, [Friedgar Pool](https://pool.friedger.de/). This address has been collecting payouts from Stacks miners since cycle 55. We are scanning a portion of the bitcoin blockchain to capture the last few of these payouts (to shorten predicate scanning for example purposes). ### Example 1 @@ -198,4 +193,4 @@ The output of the above command will be a text file `btc-transactions.txt` gener ## References - To learn more about Ordinals, refer to [Introducing Ordinals Explorer and Ordinals API](https://www.hiro.so/blog/introducing-the-ordinals-explorer-and-ordinals-api). -- The [OpenAPI specification for chainhook](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) is available to understand the scope of chainhook. \ No newline at end of file +- The [OpenAPI specification for chainhook](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) is available to understand the scope of chainhook. From 2c9c54608a411bce4fc2e172d8817955c8de9b17 Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Thu, 10 Aug 2023 14:19:38 -0500 Subject: [PATCH 15/99] Update how-to-run-chainhook-as-a-service-using-bitcoind.md Hand off to @ryanwaits --- ...n-chainhook-as-a-service-using-bitcoind.md | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index e7acd2da4..999a8803d 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -30,9 +30,9 @@ This guide is written to work with the latest Bitcoin Core software containing b datadir= # Path to existing Bitcoin folder. New data directory will be created here otherwise server=1 -rpcuser=devnet # You can set the username here -rpcpassword=devnet # You can set the password here -rpcport=8332 # You can set your localhost port number here +rpcuser=devnet +rpcpassword=devnet +rpcport=8332 rpcallowip=0.0.0.0/0 rpcallowip=::/0 txindex=1 @@ -81,20 +81,26 @@ The following `Chainhook.toml` file should be generated: [storage] working_dir = "cache" -# The Http Api allows you to register/deregister +# The Http Api allows you to register / deregister # dynamically predicates. # Disable by default. # -[http_api] -http_port = 20456 -database_uri = "redis://localhost:6379/" +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" [network] -mode = "testnet" -bitcoind_rpc_url = "http://localhost:8332" # Must match the rpcport in the bitcoin.conf -bitcoind_rpc_username = "" # Must match the rpcuser in the bitcoin.conf -bitcoind_rpc_password = "" # Must match the rpcpassword in the bitcoin.conf -stacks_node_rpc_url = "http://localhost:20443" +mode = "mainnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +# stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +bitcoind_zmq_url = "tcp://0.0.0.0:18543" [limits] max_number_of_bitcoin_predicates = 100 @@ -107,7 +113,6 @@ max_caching_memory_size_mb = 32000 [[event_source]] tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" - ``` Several of the network parameters in the generated `Chainhook.toml` configuration file need to match the network parameters contained in the `bitcoin.conf` that was created earlier in the [Setting up a Bitcoin Node](#setting-up-a-bitcoin-node) section: @@ -115,7 +120,8 @@ Several of the network parameters in the generated `Chainhook.toml` configuratio - Update the `bitcoind_rpc_username` to use the username set for `rpcuser` earlier. - Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. - Update the `bitcoind_rpc_url` to use the same host and port for the `rpcport` earlier. -- Next, update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. +- Make sure this line is commented out (and therefore inactive): `stacks_node_rpc_url = "http://localhost:20443"` +- Next, uncomment and update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. | bitcoin.conf | Chainhook.toml | | --------------- | --------------------- | @@ -125,7 +131,6 @@ Several of the network parameters in the generated `Chainhook.toml` configuratio | zmqpubhashblock | bitcoind_zmq_url | - ## Scan blockchain based on predicates Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger an action. This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). From 9379505dddc69c7c9158a80aa284f736ad9646e1 Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Thu, 10 Aug 2023 19:39:43 -0500 Subject: [PATCH 16/99] add additional examples and service sections back / update copy and examples --- ...n-chainhook-as-a-service-using-bitcoind.md | 237 +++++++++++++++--- 1 file changed, 206 insertions(+), 31 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index 999a8803d..007d21f22 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -14,7 +14,7 @@ This guide is written to work with the latest Bitcoin Core software containing b > **_NOTE:_** > -> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org's [Running A Full Node guide](https://bitcoin.org/en/full-node). +> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org [Running A Full Node guide](https://bitcoin.org/en/full-node). - Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the below configuration to the `bitcoin.conf` file. - The Chainhook will scan against bitcoin blockchain data. Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` field. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) @@ -75,7 +75,13 @@ Next, you will generate a `Chainhook.toml` file to connect Chainhook with your b chainhook config generate --mainnet ``` -The following `Chainhook.toml` file should be generated: +Several network parameters in the generated `Chainhook.toml` configuration file need to match those in the `bitcoin.conf` file created earlier in the [Setting up a Bitcoin Node](#setting-up-a-bitcoin-node) section. Please update the following parameters accordingly: + +1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`. +2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`. +3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`. + +Additionally, if you want to receive events from the configured Bitcoin node, substitute `stacks_node_rpc_url` with `bitcoind_zmq_url`, as follows: ```toml [storage] @@ -115,14 +121,6 @@ max_caching_memory_size_mb = 32000 tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" ``` -Several of the network parameters in the generated `Chainhook.toml` configuration file need to match the network parameters contained in the `bitcoin.conf` that was created earlier in the [Setting up a Bitcoin Node](#setting-up-a-bitcoin-node) section: - -- Update the `bitcoind_rpc_username` to use the username set for `rpcuser` earlier. -- Update the `bitcoind_rpc_password` to use the password set for `rpcpassword` earlier. -- Update the `bitcoind_rpc_url` to use the same host and port for the `rpcport` earlier. -- Make sure this line is commented out (and therefore inactive): `stacks_node_rpc_url = "http://localhost:20443"` -- Next, uncomment and update the `bitcoind_zmq_url` to use the same host and port for the `zmqpubhashblock` that was set earlier. - | bitcoin.conf | Chainhook.toml | | --------------- | --------------------- | | rpcuser | bitcoind_rpc_username | @@ -130,44 +128,41 @@ Several of the network parameters in the generated `Chainhook.toml` configuratio | rpcport | bitcoind_rpc_url | | zmqpubhashblock | bitcoind_zmq_url | - ## Scan blockchain based on predicates Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger an action. This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). -The following is an example to walk you through `file_append` `then-that` predicate design. - -The example collects bitcoin transactions from a particular address, specifically the bitcoin address associated with a Stacking pool, [Friedgar Pool](https://pool.friedger.de/). This address has been collecting payouts from Stacks miners since cycle 55. We are scanning a portion of the bitcoin blockchain to capture the last few of these payouts (to shorten predicate scanning for example purposes). +The following is an example to walk you through an `if_this / then_that` predicate design that appends event payloads to the configured file destination. -### Example 1 +### Example 1 - `file_append` -Run the following command in your terminal to generate a sample JSON file with predicates. +To generate a sample JSON file with predicates, execute the following command in your terminal: ```console -touch stacking.json +chainhook predicates new stacking-pool.json --bitcoin ``` -Paste the following contents into the `stacking.json` file. +Replace the contents of the `stacking-pool.json` file with the following: ```json { "chain": "bitcoin", - "uuid": "13b3fce6-eace-4552-a2f6-7672cd94cf7e", - "name": "Friedgar's Stacking Pool", + "uuid": "1", + "name": "Stacking Pool", "version": 1, "networks": { "mainnet": { - "start_block": 800000, + "start_block": 801500, "end_block": 802000, "if_this": { "scope": "outputs", "p2wpkh": { "equals": "bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe" - } - }, + } + }, "then_that": { "file_append": { - "path": "btc-transactions.txt" + "path": "bitcoin-transactions.txt" } } } @@ -175,25 +170,205 @@ Paste the following contents into the `stacking.json` file. } ``` +This example demonstrates scanning a portion of the Bitcoin blockchain to capture specific outputs from a Bitcoin address associated with a Stacking pool, [Friedgar Pool](https://pool.friedger.de/). + > **_NOTE:_** > > You can get blockchain height and current block by referring to https://explorer.hiro.so/blocks?chain=mainnet -Now, use the following command to scan the blocks based on the predicates defined in the `stacking.json` file. +Now, use the following command to scan the blocks based on the predicates defined in the `stacking-pool.json` file. ```console -chainhook predicates scan stacking.json --config-path=./Chainhook.toml +chainhook predicates scan stacking-pool.json --config-path=./Chainhook.toml ``` -The output of the above command will be a text file `btc-transactions.txt` generated based on the predicate definition. +The output of the above command will be a text file `bitcoin-transactions.txt` generated based on the predicate definition. -> **_TIP:_** +### Example 2 - `http_post` + +Let's generate another sample predicate, this time we are going to send the payload to an API endpoint: + +```console +chainhook predicates new stacking-pool-api.json --bitcoin +``` + +Replace the contents of the `stacking-pool-api.json` file with the following: + +```json +{ + "chain": "bitcoin", + "uuid": "2", + "name": "Stacking Pool (API)", + "version": 1, + "networks": { + "mainnet": { + "start_block": 801500, + "if_this": { + "scope": "outputs", + "p2wpkh": { + "equals": "bc1qs0kkdpsrzh3ngqgth7mkavlwlzr7lms2zv3wxe" + } + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/events", + "authorization_header": "12345" + } + } + } + } +} +``` + +> **_NOTE:_** > -> To optimize your experience with scanning, the following are a few knobs you can play with: +> The `start_block` is a required field when using the `http_post` `then-that` predicate. + +Once you are finished setting up your endpoint, use the following command to scan the blocks based on the predicates defined in the `stacking-pool-api.json` file. + +```console +chainhook predicates scan stacking-pool-api.json --config-path=./Chainhook.toml +``` + +The above command posts events to the URL, http://localhost:3000/events mentioned in the JSON file. + +## Initiate Chainhook Service + +In this section, you'll learn how to initiate the chainhook service using the following two ways and use the REST API call to post the events onto a server. + +- Initiate the chainhook service by passing the predicate path to the command as shown below. + +``` +chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml +``` + +The above command registers the predicate based on the predicate definition in the `stacking-pool-api.json` file. + +## Dynamically Register Predicates + +You can also dynamically register new predicates with your Chainhook service. + +First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. + +```toml +# ... + +[http_api] +http_port = 20456 +database_uri = "redis://localhost:6379/" + +# ... +``` + +> **_NOTE:_** > -> - Use of adequate values for `start_block` and `end_block` in predicates will drastically improve the performance. -> - Reducing the number of network hops between the Chainhook and the bitcoind processes can also help, so your network setup can play a major role in performance. +> This assumes you have a local instance of [Redis](https://redis.io/docs/getting-started/) running. + +Start the Chainhook service by running the following command: + +``` +chainhook service start --config-path=Chainhook.toml +``` +To dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`. Include the new predicate in JSON format within the request body. Use the following `curl` command as an example: + +```console +curl -X POST \ + -H "Content-Type: application/json" \ + -d '{ + "chain": "bitcoin", + "uuid": "3", + "name": "Ordinals", + "version": 1, + "networks": { + "mainnet": { + "start_block": 777534, + "if_this": { + "scope": "ordinals_protocol", + "operation": "inscription_feed" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/events", + "authorization_header": "12345" + } + } + } + } + }' \ + http://localhost:20456/v1/chainhooks +``` + +The sample response should look like this: + +```jsonc +{ + "chainhook": { + "predicate": { + "operation": "inscription_feed", + "scope": "ordinals_protocol" + }, + "uuid": "1" + }, + "apply": [ + { + "block_identifier": { + "hash": "0x00000000000000000003e3e2ffd3baaff2cddda7d12e84ed0ffe6f7778e988d4", + "index": 777534 + }, + "metadata": {}, + "parent_block_identifier": { + "hash": "0x0000000000000000000463a1034c59e6dc94c7e52855582af11882743b86e2a7", + "index": 777533 + }, + "timestamp": 1676923039, + "transactions": [ + { + "transaction_identifier": { + "hash": "0xca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013e" + }, + "metadata": { + "ordinal_operations": [ + { + "inscription_revealed": { + "content_bytes": "", + "content_length": 12293, + "content_type": "image/jpeg", + "inscriber_address": "bc1punnjva5ayg84kf5tmvx265uwvp8py3ux24skz43aycj5rzdgzjfq0jxsuc", + "inscription_fee": 64520, + "inscription_id": "ca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013ei0", + "inscription_number": 0, + "inscription_output_value": 10000, + "ordinal_block_height": 543164, + "ordinal_number": 1728956147664701, + "ordinal_offset": 1147664701, + "satpoint_post_inscription": "ca20efe5e4d71c16cd9b8dfe4d969efdd225ef0a26136a6a4409cb3afb2e013e:0:0", + "transfers_pre_inscription": 0 + } + } + ], + "proof": null + }, + "operations": [] + // Other transactions + } + ] + } + ], + "rollback": [] +} +``` + +Understand the output of the above JSON file with the following details. + +- The `apply` payload includes the block header and the transactions that triggered the predicate. + +- The `rollback` payload includes the block header and the transactions that triggered the predicate for a past block that is no longer part of the canonical chain and must be reverted. + +> **_TIP:_** +> +> You can also run chainhook service by passing multiple predicates. +> Example: `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml` ## References From 892933f3b8dcd0864a85a6aef5289cc39ff998a2 Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Fri, 11 Aug 2023 10:04:31 -0500 Subject: [PATCH 17/99] Update how-to-run-chainhook-as-a-service-using-bitcoind.md Clarifying language to bitcoind guide --- ...n-chainhook-as-a-service-using-bitcoind.md | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index 007d21f22..4a64496c5 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -2,7 +2,7 @@ title: Run Chainhook as a Service using Bitcoind --- -You can run Chainhook as a service to evaluate Bitcoin against your predicates. You can also dynamically register new predicates by enabling predicates registration API. +You can run Chainhook as a service to evaluate your `if_this / then_that` predicates against the Bitcoin blockchain, delivering results—either file appendations or HTTP POST requests to a server you designate—for your application's use case. You can also dynamically register new predicates as the service is running by enabling the predicates registration API. ## Prerequisites @@ -16,8 +16,8 @@ This guide is written to work with the latest Bitcoin Core software containing b > > While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org [Running A Full Node guide](https://bitcoin.org/en/full-node). -- Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the below configuration to the `bitcoin.conf` file. -- The Chainhook will scan against bitcoin blockchain data. Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` field. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) +- Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the configuration below to the `bitcoin.conf` file. +- Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` field. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) - Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below. - Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below. @@ -60,14 +60,14 @@ In the command below, use the path to your `bitcoin.conf` file from your machine > The below command is a startup process that, if this is your first time syncing a node, might take a few hours to a few days to run. Alternatively, if the directory pointed to in the `datadir` field above contains bitcoin blockchain data, syncing will resume. ```console -./bitcoind -conf= +./bitcoind -conf= ``` -Once the above command runs, you will see `zmq_url` entries in the output, enabling ZeroMQ. +Once the above command runs, you will see `zmq_url` entries in the console's stdout, displaying ZeroMQ. ### Configure Chainhook -In this section, you will configure chainhook to match the network configurations with the bitcoin config file. First, [install the latest version of chainhook](../getting-started.md#install-chainhook-from-source). +In this section, you will configure Chainhook to match the network configurations with the bitcoin config file. First, [install the latest version of Chainhook](../getting-started.md#install-chainhook-from-source). Next, you will generate a `Chainhook.toml` file to connect Chainhook with your bitcoind node. Navigate to the directory where you want to generate the `Chainhook.toml` file and use the following command in your terminal: @@ -121,6 +121,8 @@ max_caching_memory_size_mb = 32000 tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" ``` +Here is a table of the relevant parameters this guide changes in our configuration files. + | bitcoin.conf | Chainhook.toml | | --------------- | --------------------- | | rpcuser | bitcoind_rpc_username | @@ -130,7 +132,7 @@ tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-st ## Scan blockchain based on predicates -Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger an action. This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). +Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger to the deliver a result (either a file appendation or an HTTP POST result). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). The following is an example to walk you through an `if_this / then_that` predicate design that appends event payloads to the configured file destination. @@ -222,7 +224,7 @@ Replace the contents of the `stacking-pool-api.json` file with the following: > **_NOTE:_** > -> The `start_block` is a required field when using the `http_post` `then-that` predicate. +> The `start_block` is a required field when using the `http_post` `then_that` predicate. Once you are finished setting up your endpoint, use the following command to scan the blocks based on the predicates defined in the `stacking-pool-api.json` file. @@ -234,11 +236,13 @@ The above command posts events to the URL, http://localhost:3000/events mentione ## Initiate Chainhook Service -In this section, you'll learn how to initiate the chainhook service using the following two ways and use the REST API call to post the events onto a server. +In the examples above, our Chainhook scanned historical blockchain data against the user's predicates and delivered results. In this next section, let's learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service. + +We can start a Chainhook service with an existing predicate. We will also see how we can dynamically register new predicates by making an API call to our Chainhook. In both of these instances, our predicates will be delivering their results to a server set up to recieve results. - Initiate the chainhook service by passing the predicate path to the command as shown below. -``` +```console chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml ``` @@ -362,8 +366,7 @@ The sample response should look like this: Understand the output of the above JSON file with the following details. - The `apply` payload includes the block header and the transactions that triggered the predicate. - -- The `rollback` payload includes the block header and the transactions that triggered the predicate for a past block that is no longer part of the canonical chain and must be reverted. +- The `rollback` payload includes the block header and the transactions that triggered the predicate for a past block that is no longer part of the canonical chain and must be reverted. (Note: This is a chief component of Chainhook's reorg aware functionality, maintaining rollback data for blocks near the chaintip.) > **_TIP:_** > From 443544d08936669f72527480d193384a7a9ba179 Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Fri, 11 Aug 2023 10:59:39 -0500 Subject: [PATCH 18/99] update generated config with additional comments --- components/chainhook-cli/src/config/generator.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 074bc328f..132b3b51c 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -19,12 +19,15 @@ mode = "{network}" bitcoind_rpc_url = "http://localhost:8332" bitcoind_rpc_username = "devnet" bitcoind_rpc_password = "devnet" -# Bitcoin block events can be received by Chainhook -# either through a Bitcoin node's ZeroMQ interface, -# or through the Stacks node. The Stacks node is -# used by default: + +# Chainhook must be able to receive Bitcoin block events. +# These events can originate from either a Stacks node or a Bitcoin node's ZeroMQ interface. + +# By default, the service is set to receive Bitcoin block events from the Stacks node (via burnchain): stacks_node_rpc_url = "http://localhost:20443" -# but zmq can be used instead: + +# However, events can also be received directly from a Bitcoin node. +# To achieve this, comment out the `stacks_node_rpc_url` line and uncomment the following line: # bitcoind_zmq_url = "tcp://0.0.0.0:18543" [limits] @@ -36,6 +39,9 @@ max_number_of_processing_threads = 16 max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 +# If you don't require historical data for your predicates or wish to avoid downloading +# the archive data every time, you may comment out the `tsv_file_url` line. +# [[event_source]] tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" "#, From af2adfd3f99b181e7cdc20f91be25cf2d295eb06 Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Sat, 12 Aug 2023 09:21:36 -0500 Subject: [PATCH 19/99] change copy --- components/chainhook-cli/src/config/generator.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 132b3b51c..cfd743aaa 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -39,8 +39,7 @@ max_number_of_processing_threads = 16 max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 -# If you don't require historical data for your predicates or wish to avoid downloading -# the archive data every time, you may comment out the `tsv_file_url` line. +# The TSV file is required for downloading historical data for your predicates. If this is not a requirement, you can comment out the `tsv_file_url` line. # [[event_source]] tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" From fb10cb9c6e3c37484c266f41a428cec2592e0df3 Mon Sep 17 00:00:00 2001 From: Ryan Waits Date: Sat, 12 Aug 2023 09:22:33 -0500 Subject: [PATCH 20/99] remove wording around burnchain --- components/chainhook-cli/src/config/generator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index cfd743aaa..bc164814d 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -23,7 +23,7 @@ bitcoind_rpc_password = "devnet" # Chainhook must be able to receive Bitcoin block events. # These events can originate from either a Stacks node or a Bitcoin node's ZeroMQ interface. -# By default, the service is set to receive Bitcoin block events from the Stacks node (via burnchain): +# By default, the service is set to receive Bitcoin block events from the Stacks node: stacks_node_rpc_url = "http://localhost:20443" # However, events can also be received directly from a Bitcoin node. From aff36904e557026ab91a039e40959957b5bbc309 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 14 Aug 2023 15:38:36 +0200 Subject: [PATCH 21/99] fix: bump retries and delays --- components/chainhook-cli/src/scan/bitcoin.rs | 2 +- components/chainhook-cli/src/scan/stacks.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index efde5522b..fcd57be92 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -219,7 +219,7 @@ pub async fn execute_predicates_action<'a>( actions_triggered += 1; match action { BitcoinChainhookOccurrence::Http(request) => { - send_request(request, 3, 1, &ctx).await? + send_request(request, 10, 3, &ctx).await } BitcoinChainhookOccurrence::File(path, bytes) => { file_append(path, bytes, &ctx)? diff --git a/components/chainhook-cli/src/scan/stacks.rs b/components/chainhook-cli/src/scan/stacks.rs index e8db01c85..ee1353e86 100644 --- a/components/chainhook-cli/src/scan/stacks.rs +++ b/components/chainhook-cli/src/scan/stacks.rs @@ -392,7 +392,7 @@ pub async fn scan_stacks_chainstate_via_csv_using_predicate( occurrences_found += 1; let res = match action { StacksChainhookOccurrence::Http(request) => { - send_request(request, 3, 1, &ctx).await + send_request(request, 10, 3, &ctx).await } StacksChainhookOccurrence::File(path, bytes) => file_append(path, bytes, &ctx), StacksChainhookOccurrence::Data(_payload) => unreachable!(), From b9ff1aab26a26b9ada1e19d12a891fa2e8ad72fd Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 15 Aug 2023 10:36:15 +0200 Subject: [PATCH 22/99] fix: build errors --- Cargo.lock | 8 ++++---- components/chainhook-cli/Cargo.toml | 2 +- components/chainhook-cli/src/scan/bitcoin.rs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9338a064d..0851dc587 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,7 +416,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chainhook" -version = "0.20.0" +version = "1.0.0" dependencies = [ "ansi_term", "atty", @@ -457,13 +457,13 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.8.0" +version = "0.8.2" dependencies = [ "base58 0.2.0", "base64", "bitcoincore-rpc", "bitcoincore-rpc-json", - "chainhook-types 1.0.9", + "chainhook-types 1.0.11", "clarinet-utils", "crossbeam-channel 0.5.8", "dashmap 5.4.0", @@ -504,7 +504,7 @@ dependencies = [ [[package]] name = "chainhook-types" -version = "1.0.9" +version = "1.0.11" dependencies = [ "hex", "schemars 0.8.12", diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index c04ee46a4..77fb2c55d 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -15,7 +15,7 @@ redis = "0.21.5" serde-redis = "0.12.0" hex = "0.4.3" rand = "0.8.5" -chainhook-sdk = { version = "0.8.3", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.8.2", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index fcd57be92..0ecac41ba 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -219,7 +219,7 @@ pub async fn execute_predicates_action<'a>( actions_triggered += 1; match action { BitcoinChainhookOccurrence::Http(request) => { - send_request(request, 10, 3, &ctx).await + send_request(request, 10, 3, &ctx).await? } BitcoinChainhookOccurrence::File(path, bytes) => { file_append(path, bytes, &ctx)? From 131809e7d2b8e4b48b83114440a4876ec9aee9ee Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Tue, 15 Aug 2023 10:56:35 -0400 Subject: [PATCH 23/99] feat: allow matching with regex for stacks print_event (#380) ### Description This PR introduces the ability to match on a `print_event`'s values with a regex string rather than just with the previous `contains` field. Fixes #348 ### Example This allows the following new `if_this` condition for a stacks predicate: ```JSON { "scope": "print_event", "contract_identifier": "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data", "regex": "... some regex to match on the event data" } ``` --- ### Checklist - [x] All tests pass - [x] Tests added in this PR (if applicable) --- Cargo.lock | 33 +++++++++--- components/chainhook-cli/src/cli/mod.rs | 4 +- .../chainhook-cli/src/service/tests/mod.rs | 1 + components/chainhook-sdk/Cargo.toml | 1 + .../src/chainhooks/stacks/mod.rs | 52 +++++++++++++++---- .../chainhook-sdk/src/chainhooks/tests/mod.rs | 42 ++++++++++++--- .../chainhook-sdk/src/chainhooks/types.rs | 14 +++-- docs/chainhook-openapi.json | 42 +++++++++++---- 8 files changed, 151 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0851dc587..8f87fc1ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c" dependencies = [ "memchr", ] @@ -474,6 +474,7 @@ dependencies = [ "hyper", "lazy_static", "rand 0.8.5", + "regex", "reqwest", "rocket", "schemars 0.8.12", @@ -2220,7 +2221,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -2985,13 +2986,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-automata 0.3.6", + "regex-syntax 0.7.4", ] [[package]] @@ -3000,7 +3002,18 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "regex-syntax", + "regex-syntax 0.6.28", +] + +[[package]] +name = "regex-automata" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.4", ] [[package]] @@ -3009,6 +3022,12 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +[[package]] +name = "regex-syntax" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" + [[package]] name = "remove_dir_all" version = "0.5.3" diff --git a/components/chainhook-cli/src/cli/mod.rs b/components/chainhook-cli/src/cli/mod.rs index c03199fcf..28eb37783 100644 --- a/components/chainhook-cli/src/cli/mod.rs +++ b/components/chainhook-cli/src/cli/mod.rs @@ -339,7 +339,7 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { start_block: Some(34239), end_block: Some(50000), blocks: None, - predicate: StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + predicate: StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1".into(), contains: "vault".into(), }), @@ -355,7 +355,7 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { start_block: Some(34239), end_block: Some(50000), blocks: None, - predicate: StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + predicate: StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1".into(), contains: "vault".into(), }), diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index 8fbe52f46..a8d9cfcb4 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -308,6 +308,7 @@ async fn it_handles_stacks_predicates_with_network(network: &str) { #[test_case(json!({"scope":"print_event","contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09", "contains": "*"}); "with scope print_event wildcard conatins")] #[test_case(json!({"scope":"print_event","contract_identifier": "*", "contains": "vault"}); "with scope print_event wildcard contract_identifier")] #[test_case(json!({"scope":"print_event", "contract_identifier": "*", "contains": "*"}); "with scope print_event wildcard both fields")] +#[test_case(json!({"scope":"print_event", "contract_identifier": "*", "matches_regex": "(some)|(value)"}); "with scope print_event and matching_rule regex")] #[test_case(json!({"scope":"ft_event","asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.cbtc-token::cbtc","actions": ["burn"]}); "with scope ft_event")] #[test_case(json!({"scope":"nft_event","asset_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09::monkeys","actions": ["mint", "transfer", "burn"]}); "with scope nft_event")] #[test_case(json!({"scope":"stx_event","actions": ["transfer", "lock"]}); "with scope stx_event")] diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 58c7d201d..923946362 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -41,6 +41,7 @@ zeromq = { version = "0.3.3", default-features = false, features = ["tokio-runti dashmap = "5.4.0" fxhash = "0.2.1" lazy_static = "1.4.0" +regex = "1.9.3" [dev-dependencies] test-case = "3.1.0" diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 680be7e34..2cb5c4585 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -2,13 +2,14 @@ use crate::utils::{AbstractStacksBlock, Context}; use super::types::{ BlockIdentifierIndexRule, ExactMatchingRule, HookAction, StacksChainhookSpecification, - StacksContractDeploymentPredicate, StacksPredicate, + StacksContractDeploymentPredicate, StacksPredicate, StacksPrintEventBasedPredicate, }; use chainhook_types::{ BlockIdentifier, StacksChainEvent, StacksTransactionData, StacksTransactionEvent, StacksTransactionKind, TransactionIdentifier, }; use hiro_system_kit::slog; +use regex::Regex; use reqwest::{Client, Method}; use serde_json::Value as JsonValue; use stacks_rpc_client::clarity::stacks_common::codec::StacksMessageCodec; @@ -406,16 +407,47 @@ pub fn evaluate_stacks_predicate_on_transaction<'a>( match event { StacksTransactionEvent::SmartContractEvent(actual) => { if actual.topic == "print" { - if expected_event.contract_identifier == actual.contract_identifier - || expected_event.contract_identifier == "*" - { - if expected_event.contains == "*" { - return true; + match expected_event { + StacksPrintEventBasedPredicate::Contains { + contract_identifier, + contains, + } => { + if contract_identifier == &actual.contract_identifier + || contract_identifier == "*" + { + if contains == "*" { + return true; + } + let value = format!( + "{}", + expect_decoded_clarity_value(&actual.hex_value) + ); + if value.contains(contains) { + return true; + } + } } - let value = - format!("{}", expect_decoded_clarity_value(&actual.hex_value)); - if value.contains(&expected_event.contains) { - return true; + StacksPrintEventBasedPredicate::MatchesRegex { + contract_identifier, + regex, + } => { + if contract_identifier == &actual.contract_identifier + || contract_identifier == "*" + { + if let Ok(regex) = Regex::new(regex) { + let value = format!( + "{}", + expect_decoded_clarity_value(&actual.hex_value) + ); + if regex.is_match(&value) { + return true; + } + } else { + ctx.try_log(|logger| { + slog::error!(logger, "unable to parse print_event matching rule as regex") + }); + } + } } } } diff --git a/components/chainhook-sdk/src/chainhooks/tests/mod.rs b/components/chainhook-sdk/src/chainhooks/tests/mod.rs index 82e2cb2b7..a3a458d93 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/tests/mod.rs @@ -227,7 +227,7 @@ pub mod fixtures; // PrintEvent predicate tests #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "some-value".to_string() }), @@ -236,7 +236,7 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_not_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "some-value".to_string(), }), @@ -245,7 +245,7 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "wront-id".to_string(), contains: "some-value".to_string(), }), @@ -254,7 +254,7 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "wrong-value".to_string(), @@ -264,7 +264,7 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "*".to_string(), contains: "some-value".to_string(), }), @@ -273,7 +273,7 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), contains: "*".to_string(), }), @@ -282,13 +282,41 @@ pub mod fixtures; )] #[test_case( vec![vec![get_test_event_by_type("smart_contract_print_event")], vec![get_test_event_by_type("smart_contract_print_event_empty")]], - StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate { + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::Contains { contract_identifier: "*".to_string(), contains: "*".to_string(), }), 2; "PrintEvent predicate contract_identifier wildcard and contains wildcard matches all values on all print events" )] +#[test_case( + vec![vec![get_test_event_by_type("smart_contract_print_event")]], + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::MatchesRegex { + contract_identifier: "ST3AXH4EBHD63FCFPTZ8GR29TNTVWDYPGY0KDY5E5.loan-data".to_string(), + regex: "(some)|(value)".to_string(), + }), + 1; + "PrintEvent predicate matches contract_identifier and regex" +)] +#[test_case( + vec![vec![get_test_event_by_type("smart_contract_print_event")]], + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::MatchesRegex { + contract_identifier: "*".to_string(), + regex: "(some)|(value)".to_string(), + }), + 1; + "PrintEvent predicate contract_identifier wildcard checks all print events for match with regex" +)] +#[test_case( + vec![vec![get_test_event_by_type("smart_contract_print_event")]], + StacksPredicate::PrintEvent(StacksPrintEventBasedPredicate::MatchesRegex { + contract_identifier: "*".to_string(), + regex: "[".to_string(), + }), + 0 + ; + "PrintEvent predicate does not match invalid regex" +)] fn test_stacks_predicates( blocks_with_events: Vec>, predicate: StacksPredicate, diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 0a1c179a5..12e903fb3 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -776,9 +776,17 @@ pub enum StacksTrait { #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] -pub struct StacksPrintEventBasedPredicate { - pub contract_identifier: String, - pub contains: String, +#[serde(untagged)] +pub enum StacksPrintEventBasedPredicate { + Contains { + contract_identifier: String, + contains: String, + }, + MatchesRegex { + contract_identifier: String, + #[serde(rename = "matches_regex")] + regex: String, + }, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] diff --git a/docs/chainhook-openapi.json b/docs/chainhook-openapi.json index d09ef8f19..8f0c72e9d 100644 --- a/docs/chainhook-openapi.json +++ b/docs/chainhook-openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "chainhook", - "version": "0.17.0" + "version": "1.0.0" }, "paths": { "/ping": { @@ -997,9 +997,39 @@ }, { "type": "object", + "anyOf": [ + { + "type": "object", + "required": [ + "contains", + "contract_identifier" + ], + "properties": { + "contract_identifier": { + "type": "string" + }, + "contains": { + "type": "string" + } + } + }, + { + "type": "object", + "required": [ + "contract_identifier", + "matches_regex" + ], + "properties": { + "contract_identifier": { + "type": "string" + }, + "matches_regex": { + "type": "string" + } + } + } + ], "required": [ - "contains", - "contract_identifier", "scope" ], "properties": { @@ -1008,12 +1038,6 @@ "enum": [ "print_event" ] - }, - "contract_identifier": { - "type": "string" - }, - "contains": { - "type": "string" } } }, From 37f98d9e4e7055578ceaee185ad7bf60743ab0ec Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Wed, 16 Aug 2023 11:51:44 -0500 Subject: [PATCH 24/99] Update generator.rs Added @MicaiahReid's suggestions. --- components/chainhook-cli/src/config/generator.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index bc164814d..19a277f2e 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -6,9 +6,9 @@ pub fn generate_config(network: &BitcoinNetwork) -> String { r#"[storage] working_dir = "cache" -# The Http Api allows you to register / deregister -# dynamically predicates. -# Disable by default. +# The HTTP API allows you to register / deregister +# predicates dynamically. +# This is disabled by default. # # [http_api] # http_port = 20456 From 2b4b8dc1255e8059a1e9287ab5fba70c25951107 Mon Sep 17 00:00:00 2001 From: Max Efremov <51917427+mefrem@users.noreply.github.com> Date: Thu, 17 Aug 2023 09:32:34 -0500 Subject: [PATCH 25/99] docs: update chainhook guides (#384) ### Description @mefrem: Fixed a pathname error in docs, fixed a typo, and added some clarifying language to other sections. - Fixed `bitcoind` and `bitcoin.conf` pathnames - Removed double words "predicates" - Clarified bitcoind node setup instructions @ryanwaits to add changes/comments to the "Run Chainhook as a Service using Stacks" How To guide --------- Co-authored-by: Ryan Waits --- ...n-chainhook-as-a-service-using-bitcoind.md | 36 ++- ...run-chainhook-as-a-service-using-stacks.md | 229 ++++++++++++------ 2 files changed, 166 insertions(+), 99 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index 4a64496c5..7eda6c03a 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -8,27 +8,24 @@ You can run Chainhook as a service to evaluate your `if_this / then_that` predic ### Setting up a Bitcoin Node -Bitcoind is a program that implements the Bitcoin protocol for remote procedure call (RPC) use. Chainhook can be set up to interact with the Bitcoin chainstate through bitcoind's ZeroMQ interface, its embedded networking library. +The Bitcoin Core daemon (bitcoind) is a program that implements the Bitcoin protocol for remote procedure call (RPC) use. Chainhook can be set up to interact with the Bitcoin chainstate through bitcoind's ZeroMQ interface, its embedded networking library, passing raw blockchain data to be evaluated for relevant events. -This guide is written to work with the latest Bitcoin Core software containing bitcoind, [Bitcoin Core 25.0](https://bitcoincore.org/bin/bitcoin-core-25.0/). +This guide is written to work with the latest Bitcoin Core software containing bitcoind, [Bitcoin Core 25.0](https://bitcoincore.org/bin/bitcoin-core-25.0/). > **_NOTE:_** > > While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org [Running A Full Node guide](https://bitcoin.org/en/full-node). -- Navigate to your project folder, create a new file, and rename it to `bitcoin.conf` on your local machine. Copy the configuration below to the `bitcoin.conf` file. -- Copy the path of your Bitcoin directory to the `bitcoin.conf`'s `datadir` field. See the Bitcoin wiki for the [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory) -- Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below. -- Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below. - -> **_NOTE:_** -> -> Make a note of the `rpcuser`, `rpcpassword` and `rpcport` values to use them later in the chainhook configuration. +- Make note of the path of your `bitcoind` executable (located within the `bin` directory of the `bitcoin-25.0` folder you downloaded above appropriate to your operating system) +- Navigate to your project folder where your Chainhook node will reside, create a new file, and rename it to `bitcoin.conf`. Copy the configuration below to this `bitcoin.conf` file. +- Find and copy your Bitcoin data directory and paste to the `datadir` field in the `bitcoin.conf` file below. Either copy the default path (see [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory)) or copy the custom path you set for your Bitcoin data +- Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below (`devnet` is a default). +- Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below (`devnet` is a default). ```conf # Bitcoin Core Configuration -datadir= # Path to existing Bitcoin folder. New data directory will be created here otherwise +datadir=/path/to/bitcoin/directory/ # Path to Bitcoin directory server=1 rpcuser=devnet rpcpassword=devnet @@ -52,18 +49,17 @@ dbcache=4096 zmqpubhashblock=tcp://0.0.0.0:18543 ``` -Now that you have `bitcoin.conf` file ready with the bitcoind configurations, you can run the bitcoind node. -In the command below, use the path to your `bitcoin.conf` file from your machine and run the command in the terminal. - > **_NOTE:_** > > The below command is a startup process that, if this is your first time syncing a node, might take a few hours to a few days to run. Alternatively, if the directory pointed to in the `datadir` field above contains bitcoin blockchain data, syncing will resume. +Now that you have the `bitcoin.conf` file ready with the bitcoind configurations, you can run the bitcoind node. The command takes the form `path/to/bitcoind -conf=path/to/bitcoin.conf`, for example: + ```console -./bitcoind -conf= +/Volumes/SSD/bitcoin-25.0/bin/bitcoind -conf=/Volumes/SSD/project/Chainhook/bitcoin.conf ``` -Once the above command runs, you will see `zmq_url` entries in the console's stdout, displaying ZeroMQ. +Once the above command runs, you will see `zmq_url` entries in the console's stdout, displaying ZeroMQ logs of your bitcoin node. ### Configure Chainhook @@ -88,9 +84,9 @@ Additionally, if you want to receive events from the configured Bitcoin node, su working_dir = "cache" # The Http Api allows you to register / deregister -# dynamically predicates. -# Disable by default. -# +# predicates dynamically. +# This is disabled by default. + # [http_api] # http_port = 20456 # database_uri = "redis://localhost:6379/" @@ -132,7 +128,7 @@ Here is a table of the relevant parameters this guide changes in our configurati ## Scan blockchain based on predicates -Now that your bitcoind and Chainhook configurations are complete, you can define the [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks [predicates](../overview.md#if-this-predicate-design). These predicates are where the user specifies the kinds of blockchain events they want their Chainhook to trigger to the deliver a result (either a file appendation or an HTTP POST result). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). +Now that your bitcoind and Chainhook configurations are complete, you can define the Chainhook [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks. These predicates are where the user specifies the kinds of blockchain events that trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). The following is an example to walk you through an `if_this / then_that` predicate design that appends event payloads to the configured file destination. diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md index 9e29ba4d4..c05a45cd3 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md @@ -48,10 +48,15 @@ events_keys = ["*"] In this section, you will configure a chainhook to communicate with the network. Run the following command in your terminal and generate the `Chainhook.toml` file. ```console -chainhook config generate --testnet +chainhook config generate --mainnet ``` -Ensure that the `bitcoind_rpc_url`, `bitcoind_rpc_username`, `bitcoind_rpc_password` match with the `rpcport`, `rpcuser` and `rpcpassword` in the `bitcoin.conf` file and the port of the `stacks_node_rpc_url` matches the `rpc_bind` in the `Stacks.toml` file. +Several network parameters in the generated `Chainhook.toml` configuration file need to match those in the `bitcoin.conf` file created earlier in the [Setting up a Bitcoin Node](#setting-up-a-bitcoin-node) section. Please update the following parameters accordingly: + +1. Update `bitcoind_rpc_username` with the username set for `rpcuser` in `bitcoin.conf`. +2. Update `bitcoind_rpc_password` with the password set for `rpcpassword` in `bitcoin.conf`. +3. Update `bitcoind_rpc_url` with the same host and port used for `rpcport` in `bitcoin.conf`. +4. Ensure `stacks_node_rpc_url` matches the `rpc_bind` in the `Stacks.toml`. The following `Chainhook.toml` file is generated: @@ -59,9 +64,9 @@ The following `Chainhook.toml` file is generated: [storage] working_dir = "cache" -# The HTTP API allows you to register/deregister -# dynamically predicates -# Disable by default +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. # # [http_api] # http_port = 20456 @@ -69,10 +74,17 @@ working_dir = "cache" [network] mode = "mainnet" -bitcoind_rpc_url = "http://localhost:8332" # Must match with the rpcport in the bitcoin.conf -bitcoind_rpc_username = "" # Must match with the rpcuser in the bitcoin.conf -bitcoind_rpc_password = "" # Must match with the rpcpassword in the bitcoin.conf -stacks_node_rpc_url = "http://localhost:20443" # Must match with the rpc_bind in the Stacks.toml file +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +stacks_events_ingestion_port = 20455 +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" [limits] max_number_of_bitcoin_predicates = 100 @@ -85,19 +97,18 @@ max_caching_memory_size_mb = 32000 [[event_source]] tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" - ``` Ensure the following configurations are matched to allow chainhook to communicate with the Stacks and Bitcoin layers. -| bitcoin.conf | Stacks.toml | Chainhook.toml | -| ----------- | ----------- | ------------- | -| rpcuser | username | bitcoind_rpc_username | -| rpcpassword | password | bitcoind_rpc_password | -| rpcport | rpc_port | bitcoind_rpc_url | -| zmqpubhashblock | | bitcoind_zmq_url | -| | rpc_bind | stacks_node_rpc_url | -| | endpoint | stacks_events_ingestion_port | +| bitcoin.conf | Stacks.toml | Chainhook.toml | +| --------------- | ----------- | ---------------------------- | +| rpcuser | username | bitcoind_rpc_username | +| rpcpassword | password | bitcoind_rpc_password | +| rpcport | rpc_port | bitcoind_rpc_url | +| zmqpubhashblock | | bitcoind_zmq_url | +| | rpc_bind | stacks_node_rpc_url | +| | endpoint | stacks_events_ingestion_port | > **_NOTE:_** > @@ -109,33 +120,33 @@ Now that the stacks and chainhook configurations are done, you can scan your blo The following are the two examples to walk you through `file_append` and `http_post` `then-that` predicate designs. -Example 1 uses a `print_event.json` file to scan the predicates and render results using `file_append`. -Example 2 uses `print_event.json` to scan the predicates and render results using `http_post`. +Example 1 uses a `print-event.json` file to scan the predicates and render results using `file_append`. +Example 2 uses `print-event-post.json` to scan the predicates and render results using `http_post`. You can choose between the following examples to scan the predicates. -### Example 1 +### Example 1 - `file_append` Run the following command to generate a sample JSON file with predicates in your terminal. ```console -chainhook predicates new print_event_1.json --stacks +chainhook predicates new print-event.json --stacks ``` -A JSON file `print_event_1.json` is generated. +A JSON file `print-event.json` is generated. ```json { "chain": "stacks", - "uuid": "1da35032-e399-430c-bfbc-eca94709ad11", + "uuid": "6ad27176-2b83-4381-b51c-50baede11e3f", "name": "Hello world", "version": 1, "networks": { "testnet": { - "start_block": 0, - "end_block": 100, + "start_block": 34239, + "end_block": 50000, "if_this": { - "scope": "print_event_1", + "scope": "print_event", "contract_identifier": "ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1", "contains": "vault" }, @@ -146,10 +157,10 @@ A JSON file `print_event_1.json` is generated. } }, "mainnet": { - "start_block": 0, - "end_block": 100, + "start_block": 34239, + "end_block": 50000, "if_this": { - "scope": "print_event_1", + "scope": "print_event", "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1", "contains": "vault" }, @@ -167,62 +178,69 @@ A JSON file `print_event_1.json` is generated. > > You can get blockchain height and current block in the [Explorer](https://explorer.hiro.so/blocks?chain=mainnet). -The sample `arkadiko.txt` should look like this: +Now, use the following command to scan the blocks based on the predicates defined in the `mainnet` network block of your `print-event.json` file. -``` -{"apply":[{"block_identifier":{"hash":"0xf048102fee15dda049e6781c8e9aec1b39b1b9dc68d06fd9b84dced1b80ddd62","index":34307},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000000098e9ebc30e7c8e32b30ffecbd7dc5c715b5f07e1de25c","index":705648},"confirm_microblock_identifier":{"hash":"0xa65642590e98f54183a0be747a1c01e41d3ba211f6599eff2574d78ed2578468","index":2},"pox_cycle_index":18,"pox_cycle_length":2100,"pox_cycle_position":1797,"stacks_block_hash":"0x77a1aed86e895cb4b7b969986aa6a28eb2465e7227f351dd4e23d28448b222e9"},"parent_block_identifier":{"hash":"0x3117663ee5c5690d76e3f6c97597cbcc95085e7cecb0791d3edc4f95a4ce6f23","index":34306},"timestamp":1634625398,"transactions":[{"metadata":{"description":"invoked: SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1::collateralize-and-mint(u300000000, u130000000, (tuple (auto-payoff true) (stack-pox true)), \"STX-A\", SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-collateral-types-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v1-1)","execution_cost":{"read_count":155,"read_length":318312,"runtime":349859000,"write_count":10,"write_length":3621},"fee":188800,"kind":{"data":{"args":["u300000000","u130000000","(tuple (auto-payoff true) (stack-pox true))","\"STX-A\"","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-collateral-types-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v1-1"],"contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1","method":"collateralize-and-mint"},"type":"ContractCall"},"nonce":15,"position":{"index":16},"proof":null,... +```console +chainhook predicates scan print-event.json --mainnet ``` -Now, use the following command to scan the blocks based on the predicates defined in the `print_event_1.json` file. +The output of the above command will be a text file `arkadiko.txt` generated based on the predicate definition. It should look something like this: -```console -chainhook predicates scan print_event_1.json --testnet ``` - -The output of the above command will be a text file `arkadiko.txt` generated based on the predicate definition. +{"apply":[{"block_identifier":{"hash":"0xf048102fee15dda049e6781c8e9aec1b39b1b9dc68d06fd9b84dced1b80ddd62","index":34307},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000000098e9ebc30e7c8e32b30ffecbd7dc5c715b5f07e1de25c","index":705648},"confirm_microblock_identifier":{"hash":"0xa65642590e98f54183a0be747a1c01e41d3ba211f6599eff2574d78ed2578468","index":2},"pox_cycle_index":18,"pox_cycle_length":2100,"pox_cycle_position":1797,"stacks_block_hash":"0x77a1aed86e895cb4b7b969986aa6a28eb2465e7227f351dd4e23d28448b222e9"},"parent_block_identifier":{"hash":"0x3117663ee5c5690d76e3f6c97597cbcc95085e7cecb0791d3edc4f95a4ce6f23","index":34306},"timestamp":1634625398,"transactions":[{"metadata":{"description":"invoked: SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1::collateralize-and-mint(u300000000, u130000000, (tuple (auto-payoff true) (stack-pox true)), \"STX-A\", SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-collateral-types-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v1-1)","execution_cost":{"read_count":155,"read_length":318312,"runtime":349859000,"write_count":10,"write_length":3621},"fee":188800,"kind":{"data":{"args":["u300000000","u130000000","(tuple (auto-payoff true) (stack-pox true))","\"STX-A\"","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-collateral-types-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v1-1"],"contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1","method":"collateralize-and-mint"},"type":"ContractCall"},"nonce":15,"position":{"index":16},"proof":null,"raw_tx":"0x000000000104003936cedf1ddb6bc1aa6f243772cab048c586a18b000000000000000f000000000002e1800001b563c7e917648668a796d972ef9352b76035102c6159c2061bc9e9a0d161098e1ebd17d6c0754e0308d2b53ef1035e5dcfba37f0cc6f16e69f842ad7f6b691980302000000010002163936cedf1ddb6bc1aa6f243772cab048c586a18b010000000011e1a3000216982f3ec112a5f5928a5c96a914bd733793b896a51561726b6164696b6f2d667265646469652d76312d3116636f6c6c61746572616c697a652d616e642d6d696e74000000080100000000000000000000000011e1a3000100000000000000000000000007bfa4800c000000020b6175746f2d7061796f66660309737461636b2d706f78030d000000055354582d410616982f3ec112a5f5928a5c96a914bd733793b896a51961726b6164696b6f2d7374782d726573657276652d76312d310616982f3ec112a5f5928a5c96a914bd733793b896a50e61726b6164696b6f2d746f6b656e0616982f3ec112a5f5928a5c96a914bd733793b896a51e61726b6164696b6f2d636f6c6c61746572616c2d74797065732d76312d310616982f3ec112a5f5928a5c96a914bd733793b896a51461726b6164696b6f2d6f7261636c652d76312d31","receipt":{"contract_calls_stack":[],"events":[{"data":{"amount":"130000000","asset_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token::usda","recipient":"SPWKDKPZ3QDPQGDADWJ3EWPAP14CB1N1HDQ897W5"},"type":"FTMintEvent"},{"data":{"contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1","raw_value":"0x0c0000000306616374696f6e0d000000076372656174656404646174610c000000110d61756374696f6e2d656e646564040b6175746f2d7061796f6666030a636f6c6c61746572616c0100000000000000000000000011e1a30010636f6c6c61746572616c2d746f6b656e0d000000035354580f636f6c6c61746572616c2d747970650d000000055354582d4117637265617465642d61742d626c6f636b2d686569676874010000000000000000000000000000860304646562740100000000000000000000000007bfa48002696401000000000000000000000000000000010d69732d6c69717569646174656404136c6566746f7665722d636f6c6c61746572616c0100000000000000000000000000000000056f776e657205163936cedf1ddb6bc1aa6f243772cab048c586a18b107265766f6b65642d737461636b696e67041573746162696c6974792d6665652d6163637275656401000000000000000000000000000000001a73746162696c6974792d6665652d6c6173742d6163637275656401000000000000000000000000000086030e737461636b65642d746f6b656e730100000000000000000000000011e1a3000c737461636b65722d6e616d650d00000007737461636b657217757064617465642d61742d626c6f636b2d686569676874010000000000000000000000000000860304747970650d000000057661756c74","topic":"print"},"type":"SmartContractEvent"},{"data":{"amount":"300000000","recipient":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1","sender":"SPWKDKPZ3QDPQGDADWJ3EWPAP14CB1N1HDQ897W5"},"type":"STXTransferEvent"},{"data":{"contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-dao","raw_value":"0x0c0000000306616374696f6e0d000000066d696e74656404646174610c0000000206616d6f756e740100000000000000000000000007bfa48009726563697069656e7405163936cedf1ddb6bc1aa6f243772cab048c586a18b04747970650d00000005746f6b656e","topic":"print"},"type":"SmartContractEvent"},{"data":{"contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1","raw_value":"0x0703","topic":"print"},"type":"SmartContractEvent"}],"mutated_assets_radius":["SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token::usda"],"mutated_contracts_radius":["SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-dao","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1","SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token"]},"result":"(ok u130000000)","sender":"SPWKDKPZ3QDPQGDADWJ3EWPAP14CB1N1HDQ897W5","success":true},"operations":[{"account":{"address":"SPWKDKPZ3QDPQGDADWJ3EWPAP14CB1N1HDQ897W5"},"amount":{"currency":{"decimals":6,"metadata":{"asset_class_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.usda-token::usda","asset_identifier":null,"standard":"SIP10"},"symbol":"TOKEN"},"value":130000000},"operation_identifier":{"index":0},"status":"SUCCESS","type":"CREDIT"},{"account":{"address":"SPWKDKPZ3QDPQGDADWJ3EWPAP14CB1N1HDQ897W5"},"amount":{"currency":{"decimals":6,"symbol":"STX"},"value":300000000},"operation_identifier":{"index":1},"related_operations":[{"index":2}],"status":"SUCCESS","type":"DEBIT"},{"account":{"address":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1"},"amount":{"currency":{"decimals":6,"symbol":"STX"},"value":300000000},"operation_identifier":{"index":2},"related_operations":[{"index":1}],"status":"SUCCESS","type":"CREDIT"}],"transaction_identifier":{"hash":"0x580d89b79f4e7cda9e2ae9f1a70a5392149a055b0b6f25968afb80c6cc09306a"}}]}],"chainhook":{"is_streaming_blocks":false,"predicate":{"contains":"vault","contract_identifier":"SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1","scope":"print_event"},"uuid":"6ad27176-2b83-4381-b51c-50baede11e3f"},"rollback":[]} +``` > **_TIP:_** > To optimize your experience with scanning, the following are a few knobs you can play with: > Use of adequate values for `start_block` and `end_block` in predicates will drastically improve the performance. > Networking: reducing the number of network hops between the chainhook and the bitcoind processes can also help. -The sample output file, `arkadiko.txt,` looks like this: - -```text -{"apply":[{"block_identifier":{"hash":"0xf048102fee15dda049e6781c8e9aec1b39b1b9dc68d06fd9b84dced1b80ddd62","index":34307},"metadata":{"bitcoin_anchor_block_identifier":{"hash":"0x000000000000000000098e9ebc30e7c8e32b30ffecbd7dc5c715b5f07e1de25c","index":705648},"confirm_microblock_identifier":{"hash":"0xa65642590e98f54183a0be747a1c01e41d3ba211f6599eff2574d78ed2578468","index":2},"pox_cycle_index":18,"pox_cycle_length":2100,"pox_cycle_position":1797,"stacks_block_hash":"0x77a1aed86e895cb4b7b969986aa6a28eb2465e7227f351dd4e23d28448b222e9"},"parent_block_identifier":{"hash":"0x3117663ee5c5690d76e3f6c97597cbcc95085e7cecb0791d3edc4f95a4ce6f23","index":34306},"timestamp":1634625398,"transactions":[{"metadata":{"description":"invoked: SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1::collateralize-and-mint(u300000000, u130000000, (tuple (auto-payoff true) (stack-pox true)), \"STX-A\", SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-stx-reserve-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-token, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-collateral-types-v1-1, SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-oracle-v1-1)","execution_cost":{"read_count":155,"read_length":318312,"runtime":349859000,"write_count":10,"write_length":3621},"fee":188800,"kind":{"data":{"args":["u300000000","u130000000","(tuple (auto-payoff true) (stack-pox true))","\"STX-A\"",......... -``` - -### Example 2 +### Example 2 - `http_post` Run the following command to generate a sample JSON file with predicates in your terminal. ```console -chainhook predicates new print_event_2.json --stacks +chainhook predicates new print-event-post.json --stacks ``` -A JSON file `print_event_2.json` is generated. +Update the generated JSON file `print-event-post.json` with the following: ```json { "chain": "stacks", - "uuid": "1", - "name": "Lorem ipsum", + "uuid": "e5fa09b2-ec3e-4b6a-9a4a-0ebb454f6e19", + "name": "Hello world", "version": 1, "networks": { "testnet": { - "if_this": { - "scope": "print_event_2", - "contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09", - "contains": "vault" - }, - "then_that": { - "http_post": { - "url": "http://localhost:3000/api/v1/vaults", - "authorization_header": "Bearer cn389ncoiwuencr" - } - }, - "start_block": 10200, - "expire_after_occurrence": 5, + "if_this": { + "scope": "print_event", + "contract_identifier": "ST1SVA0SST0EDT4MFYGWGP6GNSXMMQJDVP1G8QTTC.arkadiko-freddie-v1-1", + "contains": "vault" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/events", + "authorization_header": "Bearer cn389ncoiwuencr" + } + }, + "start_block": 10200, + "expire_after_occurrence": 5 + }, + "mainnet": { + "if_this": { + "scope": "print-event", + "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1", + "contains": "vault" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/events", + "authorization_header": "Bearer cn389ncoiwuencr" + } + }, + "start_block": 10200, + "expire_after_occurrence": 5 } } } @@ -232,13 +250,13 @@ A JSON file `print_event_2.json` is generated. > > The `start_block` is the required field to use the `http_post` `then-that` predicate. -Now, use the following command to scan the blocks based on the predicates defined in the `print_event_2.json` file. +Now, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file. ```console -chainhook predicates scan print_event_2.json --testnet +chainhook predicates scan print-event-post.json --mainnet ``` -The above command posts events to the URL `http://localhost:3000/api/v1/vaults` mentioned in the `Chainhook.toml` file. +The above command posts events to the URL `http://localhost:3000/events` mentioned in the `Chainhook.toml` file. ## Initiate Chainhook Service @@ -247,23 +265,76 @@ In this section, you'll learn how to initiate the chainhook service using the fo - Initiate the chainhook service by passing the predicate path to the command as shown below. ```console - chainhook service start --predicate-path=print_event_1.json --config-path=Chainhook.toml + chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml ``` - The above command registers the predicates based on the predicate definition in the `print_event_1.json` file. - -- You can also dynamically register predicates via the predicate registration server. To do this: - - Uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. - ``` - [http_api] - http_port = 20456 - database_uri = "redis://localhost:6379/" - ``` - - Start the Chainhook service by running ```chainhook service start --config-path=Chainhook.toml```. - - Now, the predicate registration server is running at `localhost:20456`. To dynamically register a new predicate, send a POST request to `localhost:20456/v1/chainhooks` with the new predicate, in JSON format, included in the request body. For complete documentation on the API endpoints available, see the [OpenAPI](https://raw.githubusercontent.com/hirosystems/chainhook/develop/docs/chainhook-openapi.json) specification. - - ![Example post request](../images/chainhook-post-request.jpeg) + The above command registers the predicates based on the predicate definition in the `print-event.json` file. + +## Dynamically Register Predicates + +You can also dynamically register new predicates with your Chainhook service. + +First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. + +```toml +# ... + +[http_api] +http_port = 20456 +database_uri = "redis://localhost:6379/" + +# ... +``` + +> **_NOTE:_** +> +> This assumes you have a local instance of [Redis](https://redis.io/docs/getting-started/) running. + +Start the Chainhook service by running the following command: + +``` +chainhook service start --config-path=Chainhook.toml +``` + +To dynamically register a new predicate, send a POST request to the running predicate registration server at `localhost:20456/v1/chainhooks`. Include the new predicate in JSON format within the request body. In another terminal window, use the following `curl` command as an example: + +```console +curl -X POST \ + -H "Content-Type: application/json" \ + -d '{ + "chain": "stacks", + "uuid": "42", + "name": "Arkadiko", + "version": 1, + "networks": { + "mainnet": { + "start_block": 777534, + "if_this": { + "scope": "print-event", + "contract_identifier": "SP2C2YFP12AJZB4MABJBAJ55XECVS7E4PMMZ89YZR.arkadiko-freddie-v1-1", + "contains": "vault" + }, + "then_that": { + "http_post": { + "url": "http://localhost:3000/events", + "authorization_header": "Bearer cn389ncoiwuencr" + } + } + } + } + }' \ + http://localhost:20456/v1/chainhooks +``` + +You should see in your terminal: + +```console +{"result":"42","status":200} +``` + +And if you hop back over to your `Chainhook` service terminal window, you will see that your predicate has been registered. > **_TIP:_** > > You can also run chainhook service by passing multiple predicates. -> Example: ```chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml``` +> Example: `chainhook service start --predicate-path=predicate_1.json --predicate-path=predicate_2.json --config-path=Chainhook.toml` From 5213f5f67a8adfddc72de7c707eb9d0de46150a2 Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Thu, 17 Aug 2023 16:40:42 -0400 Subject: [PATCH 26/99] fix: retrieve blocks until tip --- components/chainhook-cli/src/scan/bitcoin.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 0ecac41ba..2d9c6e003 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -54,7 +54,7 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( let (end_block, update_end_block) = match predicate_spec.end_block { Some(end_block) => (end_block, false), None => match bitcoin_rpc.get_blockchain_info() { - Ok(result) => (result.blocks - 1, true), + Ok(result) => (result.blocks, true), Err(e) => { return Err(format!( "unable to retrieve Bitcoin chain tip ({})", From fd3627f2232cf7d50c69e762877d29c0d352ffe7 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 21 Aug 2023 18:01:13 +0200 Subject: [PATCH 27/99] chore: tweak logs --- components/chainhook-cli/src/cli/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/chainhook-cli/src/cli/mod.rs b/components/chainhook-cli/src/cli/mod.rs index 28eb37783..64f136478 100644 --- a/components/chainhook-cli/src/cli/mod.rs +++ b/components/chainhook-cli/src/cli/mod.rs @@ -273,14 +273,14 @@ pub fn main() { let opts: Opts = match Opts::try_parse() { Ok(opts) => opts, Err(e) => { - println!("{}", e); + error!(ctx.expect_logger(), "{e}"); process::exit(1); } }; - match hiro_system_kit::nestable_block_on(handle_command(opts, ctx)) { + match hiro_system_kit::nestable_block_on(handle_command(opts, ctx.clone())) { Err(e) => { - println!("{e}"); + error!(ctx.expect_logger(), "{e}"); process::exit(1); } Ok(_) => {} From 61d9e2da6c38dfe13d1c59d152f268e2050e78ea Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 21 Aug 2023 18:02:04 +0200 Subject: [PATCH 28/99] chore: add helper to BlockIdentifier --- components/chainhook-types-rs/src/rosetta.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/chainhook-types-rs/src/rosetta.rs b/components/chainhook-types-rs/src/rosetta.rs index 63db84ca4..39ba9c005 100644 --- a/components/chainhook-types-rs/src/rosetta.rs +++ b/components/chainhook-types-rs/src/rosetta.rs @@ -14,6 +14,16 @@ pub struct BlockIdentifier { pub hash: String, } +impl BlockIdentifier { + pub fn get_hash_bytes_str(&self) -> &str { + &self.hash[2..] + } + + pub fn get_hash_bytes(&self) -> Vec { + hex::decode(&self.get_hash_bytes_str()).unwrap() + } +} + impl Display for BlockIdentifier { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { write!( From 1dc764be70f86d4f41e71a1fa93b17aee361ffcd Mon Sep 17 00:00:00 2001 From: Lavanya Kasturi Date: Mon, 21 Aug 2023 11:21:43 -0500 Subject: [PATCH 29/99] Added example for contains to use regex --- .../how-to-use-chainhooks-with-stacks.md | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md index 796c73154..4d17caec0 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md @@ -100,8 +100,11 @@ Get any transaction moving STX tokens: Get any transaction emitting given print events predicate - `contract-identifier` mandatory argument admits: - - string type, fully qualifying the contract to observe. Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09` `contains` mandatory argument admits: - - string type, used for matching event + - string type, fully qualifying the contract to observe. Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09` + - `contains` argument admits string type, used for matching an event containing the specified string. Example: `vault` + - `matches_regex` argument admits string type that should be valid regex, used for matching an event that regex matches with the specified string. Example: `(?:^|\\W)vault(?:$|\\W)` + +The following example uses `contains` argument: ```json { @@ -113,13 +116,25 @@ Get any transaction emitting given print events predicate } ``` +The following example uses `matches_regex` argument: + +```json +{ + "if_this": { + "scope": "print_event", + "contract_identifier": "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09", + "matches_regex": "(?:^|\\W)vault(?:$|\\W)" + }, +} +``` + Get any transaction calling a specific method for a given contract **directly**. > [!Warning] > If the observed method is being called by another contract, this predicate won't detect it. - `contract-identifier` mandatory argument admits: - - string type, fully qualifying the contract to observe. Example: `SP000000000000000000002Q6VF78.pox` `method` mandatory argument admits: - string type, used for specifying the method to observe. Example: `stack-stx`. + - string type, fully qualifying the contract to observe. Example: `SP000000000000000000002Q6VF78.pox` `method` mandatory argument admits: - string type, used for specifying the method to observe. Example: `stack-stx` ```json { From ef568b9cf3cd603395015fd7ef5bb691beb719d5 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 21 Aug 2023 22:09:10 +0200 Subject: [PATCH 30/99] refactor: pass block instead of blocks --- components/chainhook-sdk/src/observer/mod.rs | 105 +++++++++++-------- 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index e40b47c35..5b8ee8480 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -33,7 +33,7 @@ use rocket::config::{self, Config, LogLevel}; use rocket::data::{Limits, ToByteUnit}; use rocket::serde::Deserialize; use rocket::Shutdown; -use std::collections::{BTreeMap, BTreeSet, HashMap}; +use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque}; use std::error::Error; use std::net::{IpAddr, Ipv4Addr}; use std::path::PathBuf; @@ -397,7 +397,7 @@ pub fn start_event_observer( observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver>)>, + block_pre_processor: Option<(Sender, Receiver)>, ctx: Context, ) -> Result<(), Box> { match config.bitcoin_block_signaling { @@ -458,7 +458,7 @@ pub async fn start_bitcoin_event_observer( observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver>)>, + block_pre_processor: Option<(Sender, Receiver)>, ctx: Context, ) -> Result<(), Box> { let chainhook_store = ChainhookStore::new(); @@ -496,7 +496,7 @@ pub async fn start_stacks_event_observer( observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver>)>, + block_pre_processor: Option<(Sender, Receiver)>, ctx: Context, ) -> Result<(), Box> { let indexer_config = IndexerConfig { @@ -794,8 +794,8 @@ pub fn gather_proofs<'a>( } pub enum HandleBlock { - ApplyBlocks(Vec), - UndoBlocks(Vec), + ApplyBlocks(BitcoinBlockData), + UndoBlocks(BitcoinBlockData), } pub async fn start_observer_commands_handler( @@ -805,7 +805,7 @@ pub async fn start_observer_commands_handler( observer_events_tx: Option>, ingestion_shutdown: Option, observer_metrics: Arc>, - block_pre_processor: Option<(Sender, Receiver>)>, + block_pre_processor: Option<(Sender, Receiver)>, ctx: Context, ) -> Result<(), Box> { let mut chainhooks_occurrences_tracker: HashMap = HashMap::new(); @@ -906,9 +906,21 @@ pub async fn start_observer_commands_handler( let mut new_blocks = vec![]; for header in data.new_headers.iter() { - match bitcoin_block_store.get(&header.block_identifier) { + match bitcoin_block_store.remove(&header.block_identifier) { Some(block) => { - new_blocks.push(block.clone()); + // Time for pre-processing + let (_updated, updated_block) = handle_block_pre_processing( + &block_pre_processor, + block, + true, + &ctx, + ); + // Keep a copy of the pre-processed version + bitcoin_block_store.insert( + updated_block.block_identifier.clone(), + updated_block.clone(), + ); + new_blocks.push(updated_block); } None => { ctx.try_log(|logger| { @@ -922,13 +934,6 @@ pub async fn start_observer_commands_handler( } } - new_blocks = handle_blocks_pre_processing( - &block_pre_processor, - new_blocks, - true, - &ctx, - ); - for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { Some(block) => { @@ -973,9 +978,21 @@ pub async fn start_observer_commands_handler( }); for header in data.headers_to_rollback.iter() { - match bitcoin_block_store.get(&header.block_identifier) { + match bitcoin_block_store.remove(&header.block_identifier) { Some(block) => { - blocks_to_rollback.push(block.clone()); + // Time for pre-processing + let (_updated, updated_block) = handle_block_pre_processing( + &block_pre_processor, + block, + false, + &ctx, + ); + // Keep a copy of the pre-processed version + bitcoin_block_store.insert( + updated_block.block_identifier.clone(), + updated_block.clone(), + ); + blocks_to_rollback.push(updated_block); } None => { ctx.try_log(|logger| { @@ -989,17 +1006,22 @@ pub async fn start_observer_commands_handler( } } - blocks_to_rollback = handle_blocks_pre_processing( - &block_pre_processor, - blocks_to_rollback, - false, - &ctx, - ); - for header in data.headers_to_apply.iter() { - match bitcoin_block_store.get_mut(&header.block_identifier) { + match bitcoin_block_store.remove(&header.block_identifier) { Some(block) => { - blocks_to_apply.push(block.clone()); + // Time for pre-processing + let (_updated, updated_block) = handle_block_pre_processing( + &block_pre_processor, + block, + true, + &ctx, + ); + // Keep a copy of the pre-processed version + bitcoin_block_store.insert( + updated_block.block_identifier.clone(), + updated_block.clone(), + ); + blocks_to_apply.push(updated_block); } None => { ctx.try_log(|logger| { @@ -1013,13 +1035,6 @@ pub async fn start_observer_commands_handler( } } - blocks_to_apply = handle_blocks_pre_processing( - &block_pre_processor, - blocks_to_apply, - true, - &ctx, - ); - for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { Some(block) => { @@ -1524,23 +1539,23 @@ pub async fn start_observer_commands_handler( Ok(()) } -fn handle_blocks_pre_processing( - block_pre_processor: &Option<(Sender, Receiver>)>, - blocks: Vec, +fn handle_block_pre_processing( + block_pre_processor: &Option<(Sender, Receiver)>, + block: BitcoinBlockData, apply: bool, ctx: &Context, -) -> Vec { +) -> (bool, BitcoinBlockData) { if let Some(ref processor) = block_pre_processor { ctx.try_log(|logger| slog::info!(logger, "Sending blocks to pre-processor",)); let _ = processor.0.send(match apply { - true => HandleBlock::ApplyBlocks(blocks.clone()), - false => HandleBlock::UndoBlocks(blocks.clone()), + true => HandleBlock::ApplyBlocks(block.clone()), + false => HandleBlock::UndoBlocks(block.clone()), }); ctx.try_log(|logger| slog::info!(logger, "Waiting for blocks from pre-processor",)); match processor.1.recv() { - Ok(updated_blocks) => { - ctx.try_log(|logger| slog::info!(logger, "Blocks received from pre-processor",)); - return updated_blocks; + Ok(updated_block) => { + ctx.try_log(|logger| slog::info!(logger, "Block received from pre-processor",)); + return (true, updated_block); } Err(e) => { ctx.try_log(|logger| { @@ -1550,11 +1565,11 @@ fn handle_blocks_pre_processing( e.to_string() ) }); - return blocks; + return (false, block); } } } - blocks + return (false, block); } #[cfg(test)] From 275526620209e8b7137722f9c081aa7b9dca31e5 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 21 Aug 2023 22:09:49 +0200 Subject: [PATCH 31/99] fix: ensure that the parent block was previously received. else, fetch it --- .../src/indexer/fork_scratch_pad.rs | 9 ++ components/chainhook-sdk/src/observer/mod.rs | 106 ++++++++++++------ 2 files changed, 82 insertions(+), 33 deletions(-) diff --git a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs index 3f47941c5..0c040c134 100644 --- a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs +++ b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs @@ -29,6 +29,15 @@ impl ForkScratchPad { } } + pub fn can_process_header(&self, header: &BlockHeader) -> bool { + if self.headers_store.is_empty() { + return true + } + + self.headers_store + .contains_key(&header.parent_block_identifier) + } + pub fn process_header( &mut self, header: BlockHeader, diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 5b8ee8480..a976a1bcd 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -697,45 +697,85 @@ pub fn start_zeromq_runloop( } }; let block_hash = hex::encode(message.get(1).unwrap().to_vec()); + let mut block_hashes: VecDeque = VecDeque::new(); + block_hashes.push_front(block_hash); - let block = match download_and_parse_block_with_retry( - &http_client, - &block_hash, - &bitcoin_config, - &ctx_moved, - ) - .await - { - Ok(block) => block, - Err(e) => { + while let Some(block_hash) = block_hashes.pop_front() { + + let block = match download_and_parse_block_with_retry( + &http_client, + &block_hash, + &bitcoin_config, + &ctx_moved, + ) + .await + { + Ok(block) => block, + Err(e) => { + ctx_moved.try_log(|logger| { + slog::warn!( + logger, + "unable to download_and_parse_block: {}", + e.to_string() + ) + }); + continue; + } + }; + + let header = block.get_block_header(); + ctx_moved.try_log(|logger| { + slog::info!( + logger, + "Bitcoin block #{} dispatched for processing", + block.height + ) + }); + + let _ = observer_commands_tx + .send(ObserverCommand::ProcessBitcoinBlock(block)); + + if bitcoin_blocks_pool.can_process_header(&header) { + match bitcoin_blocks_pool.process_header(header, &ctx_moved) { + Ok(Some(event)) => { + let _ = observer_commands_tx + .send(ObserverCommand::PropagateBitcoinChainEvent(event)); + }, + Err(e) => { + ctx_moved.try_log(|logger| { + slog::warn!( + logger, + "Unable to append block: {:?}", e + ) + }); + } + Ok(None) => { + ctx_moved.try_log(|logger| { + slog::warn!( + logger, + "Unable to append block" + ) + }); + } + } + } else { + // Handle a behaviour specific to ZMQ usage in bitcoind. + // Considering a simple re-org: + // A (1) - B1 (2) - C1 (3) + // \ B2 (4) - C2 (5) - D2 (6) + // When D2 is being discovered (making A -> B2 -> C2 -> D2 the new canonical fork) + // it looks like ZMQ is only publishing D2. + // Without additional operation, we end up with a block that with a block that we + // can't handle. + let parent_block_hash = header.parent_block_identifier.get_hash_bytes_str().to_string(); ctx_moved.try_log(|logger| { - slog::warn!( + slog::info!( logger, - "unable to download_and_parse_block: {}", - e.to_string() + "Possible re-org detected, retrieving parent block {parent_block_hash}" ) }); - continue; + block_hashes.push_front(parent_block_hash); } - }; - - ctx_moved.try_log(|logger| { - slog::info!( - logger, - "Bitcoin block #{} dispatched for processing", - block.height - ) - }); - - let header = block.get_block_header(); - let _ = observer_commands_tx - .send(ObserverCommand::ProcessBitcoinBlock(block)); - - if let Ok(Some(event)) = - bitcoin_blocks_pool.process_header(header, &ctx_moved) - { - let _ = observer_commands_tx - .send(ObserverCommand::PropagateBitcoinChainEvent(event)); } } }); From 6fecfd2f41fe5bc8c672a51bcf3050c634927b84 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 22 Aug 2023 13:47:04 +0200 Subject: [PATCH 32/99] fix: remove event_handlers --- components/chainhook-cli/src/config/mod.rs | 1 - components/chainhook-sdk/src/indexer/fork_scratch_pad.rs | 4 ++-- components/chainhook-sdk/src/observer/mod.rs | 8 -------- components/chainhook-sdk/src/observer/tests/mod.rs | 1 - 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 039ff97fb..7db407523 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -109,7 +109,6 @@ impl Config { pub fn get_event_observer_config(&self) -> EventObserverConfig { EventObserverConfig { bitcoin_rpc_proxy_enabled: true, - event_handlers: vec![], chainhook_config: None, ingestion_port: DEFAULT_INGESTION_PORT, bitcoind_rpc_username: self.network.bitcoind_rpc_username.clone(), diff --git a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs index 0c040c134..ca32bba7c 100644 --- a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs +++ b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs @@ -31,9 +31,9 @@ impl ForkScratchPad { pub fn can_process_header(&self, header: &BlockHeader) -> bool { if self.headers_store.is_empty() { - return true + return true; } - + self.headers_store .contains_key(&header.parent_block_identifier) } diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index a976a1bcd..df23772a7 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -1123,8 +1123,6 @@ pub async fn start_observer_commands_handler( } }; - for event_handler in event_handlers.iter() { - event_handler.propagate_bitcoin_event(&chain_event).await; } // process hooks let mut hooks_ids_to_deregister = vec![]; @@ -1275,9 +1273,6 @@ pub async fn start_observer_commands_handler( ctx.try_log(|logger| { slog::info!(logger, "Handling PropagateStacksChainEvent command") }); - for event_handler in event_handlers.iter() { - event_handler.propagate_stacks_event(&chain_event).await; - } let mut hooks_ids_to_deregister = vec![]; let mut requests = vec![]; let mut report = PredicateEvaluationReport::new(); @@ -1481,9 +1476,6 @@ pub async fn start_observer_commands_handler( ctx.try_log(|logger| { slog::info!(logger, "Handling NotifyBitcoinTransactionProxied command") }); - for event_handler in event_handlers.iter() { - event_handler.notify_bitcoin_transaction_proxied().await; - } if let Some(ref tx) = observer_events_tx { let _ = tx.send(ObserverEvent::NotifyBitcoinTransactionProxied); } diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index 8d4b3a7f1..72a15cdd7 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -30,7 +30,6 @@ fn generate_test_config() -> (EventObserverConfig, ChainhookStore) { let config: EventObserverConfig = EventObserverConfig { chainhook_config: Some(ChainhookConfig::new()), bitcoin_rpc_proxy_enabled: false, - event_handlers: vec![], ingestion_port: 0, bitcoind_rpc_username: "user".into(), bitcoind_rpc_password: "user".into(), From 7cafaf318447af6c2293df5aaff2646c9da1d99f Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 22 Aug 2023 13:47:25 +0200 Subject: [PATCH 33/99] chore: dead code - BitcoinBlockPool --- .../src/indexer/bitcoin/blocks_pool.rs | 366 ------------------ .../chainhook-sdk/src/indexer/bitcoin/mod.rs | 3 - 2 files changed, 369 deletions(-) delete mode 100644 components/chainhook-sdk/src/indexer/bitcoin/blocks_pool.rs diff --git a/components/chainhook-sdk/src/indexer/bitcoin/blocks_pool.rs b/components/chainhook-sdk/src/indexer/bitcoin/blocks_pool.rs deleted file mode 100644 index 2c0c8e130..000000000 --- a/components/chainhook-sdk/src/indexer/bitcoin/blocks_pool.rs +++ /dev/null @@ -1,366 +0,0 @@ -use crate::{ - indexer::{ChainSegment, ChainSegmentIncompatibility}, - utils::Context, -}; -use chainhook_types::{ - BitcoinBlockData, BitcoinChainEvent, BitcoinChainUpdatedWithBlocksData, - BitcoinChainUpdatedWithReorgData, BlockIdentifier, -}; -use hiro_system_kit::slog; -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; - -pub struct BitcoinBlockPool { - canonical_fork_id: usize, - orphans: BTreeSet, - block_store: HashMap, - forks: BTreeMap, -} - -impl BitcoinBlockPool { - pub fn new() -> BitcoinBlockPool { - let mut forks = BTreeMap::new(); - forks.insert(0, ChainSegment::new()); - BitcoinBlockPool { - canonical_fork_id: 0, - block_store: HashMap::new(), - orphans: BTreeSet::new(), - forks, - } - } - - pub fn process_block( - &mut self, - block: BitcoinBlockData, - ctx: &Context, - ) -> Result, String> { - ctx.try_log(|logger| { - slog::info!( - logger, - "Start processing Bitcoin {}", - block.block_identifier - ) - }); - - // Keep block data in memory - let existing_entry = self - .block_store - .insert(block.block_identifier.clone(), block.clone()); - if existing_entry.is_some() { - ctx.try_log(|logger| { - slog::warn!( - logger, - "Bitcoin {} has already been processed", - block.block_identifier - ) - }); - return Ok(None); - } - - for (i, fork) in self.forks.iter() { - ctx.try_log(|logger| slog::info!(logger, "Active fork {}: {}", i, fork)); - } - // Retrieve previous canonical fork - let previous_canonical_fork_id = self.canonical_fork_id; - let previous_canonical_fork = match self.forks.get(&previous_canonical_fork_id) { - Some(fork) => fork.clone(), - None => { - ctx.try_log(|logger| { - slog::error!(logger, "unable to retrieve previous bitcoin fork") - }); - return Ok(None); - } - }; - - let mut fork_updated = None; - for (_, fork) in self.forks.iter_mut() { - let (block_appended, mut new_fork) = fork.try_append_block(&block, ctx); - if block_appended { - if let Some(new_fork) = new_fork.take() { - let fork_id = self.forks.len(); - self.forks.insert(fork_id, new_fork); - fork_updated = self.forks.get_mut(&fork_id); - } else { - fork_updated = Some(fork); - } - // A block can only be added to one segment - break; - } - } - - let fork_updated = match fork_updated.take() { - Some(fork) => { - ctx.try_log(|logger| { - slog::debug!( - logger, - "Bitcoin {} successfully appended to {}", - block.block_identifier, - fork - ) - }); - fork - } - None => { - ctx.try_log(|logger| { - slog::debug!( - logger, - "Unable to process Bitcoin {} - inboxed for later", - block.block_identifier - ) - }); - self.orphans.insert(block.block_identifier.clone()); - return Ok(None); - } - }; - - // Process former orphans - let orphans = self.orphans.clone(); - let mut orphans_to_untrack = HashSet::new(); - - let mut at_least_one_orphan_appended = true; - // As long as we are successful appending blocks that were previously unprocessable, - // Keep looping on this backlog - let mut applied = HashSet::new(); - let mut forks_created = vec![]; - while at_least_one_orphan_appended { - at_least_one_orphan_appended = false; - for orphan_block_identifier in orphans.iter() { - if applied.contains(orphan_block_identifier) { - continue; - } - let block = match self.block_store.get(orphan_block_identifier) { - Some(block) => block.clone(), - None => continue, - }; - - let (orphan_appended, mut new_fork) = fork_updated.try_append_block(&block, ctx); - if orphan_appended { - applied.insert(orphan_block_identifier); - orphans_to_untrack.insert(orphan_block_identifier); - if let Some(new_fork) = new_fork.take() { - forks_created.push(new_fork); - } - } - at_least_one_orphan_appended = at_least_one_orphan_appended || orphan_appended; - } - } - - // Update orphans - for orphan in orphans_to_untrack.into_iter() { - ctx.try_log(|logger| slog::info!(logger, "Dequeuing orphan {}", orphan)); - self.orphans.remove(orphan); - } - - // Select canonical fork - let mut canonical_fork_id = 0; - let mut highest_height = 0; - for (fork_id, fork) in self.forks.iter() { - ctx.try_log(|logger| slog::info!(logger, "Active fork: {} - {}", fork_id, fork)); - if fork.get_length() >= highest_height { - highest_height = fork.get_length(); - canonical_fork_id = *fork_id; - } - } - ctx.try_log(|logger| { - slog::info!( - logger, - "Active fork selected as canonical: {}", - canonical_fork_id - ) - }); - - self.canonical_fork_id = canonical_fork_id; - // Generate chain event from the previous and current canonical forks - let canonical_fork = self.forks.get(&canonical_fork_id).unwrap().clone(); - if canonical_fork.eq(&previous_canonical_fork) { - ctx.try_log(|logger| slog::info!(logger, "Canonical fork unchanged")); - return Ok(None); - } - - let res = self.generate_block_chain_event(&canonical_fork, &previous_canonical_fork, ctx); - let mut chain_event = match res { - Ok(chain_event) => chain_event, - Err(ChainSegmentIncompatibility::ParentBlockUnknown) => { - self.canonical_fork_id = previous_canonical_fork_id; - return Ok(None); - } - _ => return Ok(None), - }; - - self.collect_and_prune_confirmed_blocks(&mut chain_event, ctx); - - Ok(Some(chain_event)) - } - - pub fn collect_and_prune_confirmed_blocks( - &mut self, - chain_event: &mut BitcoinChainEvent, - ctx: &Context, - ) { - let (tip, confirmed_blocks) = match chain_event { - BitcoinChainEvent::ChainUpdatedWithBlocks(ref mut event) => { - match event.new_blocks.last() { - Some(tip) => (tip.block_identifier.clone(), &mut event.confirmed_blocks), - None => return, - } - } - BitcoinChainEvent::ChainUpdatedWithReorg(ref mut event) => { - match event.blocks_to_apply.last() { - Some(tip) => (tip.block_identifier.clone(), &mut event.confirmed_blocks), - None => return, - } - } - }; - - let mut forks_to_prune = vec![]; - let mut ancestor_identifier = &tip; - - // Retrieve the whole canonical segment present in memory, ascending order - // [1] ... [6] [7] - let canonical_segment = { - let mut segment = vec![]; - while let Some(ancestor) = self.block_store.get(&ancestor_identifier) { - ancestor_identifier = &ancestor.parent_block_identifier; - segment.push(ancestor.block_identifier.clone()); - } - segment - }; - if canonical_segment.len() < 7 { - return; - } - // Any block beyond 6th ancestor is considered as confirmed and can be pruned - let cut_off = &canonical_segment[5]; - - // Prune forks using the confirmed block - let mut blocks_to_prune = vec![]; - for (fork_id, fork) in self.forks.iter_mut() { - let mut res = fork.prune_confirmed_blocks(&cut_off); - blocks_to_prune.append(&mut res); - if fork.block_ids.is_empty() { - forks_to_prune.push(*fork_id); - } - } - - // Prune orphans using the confirmed block - let iter = self.orphans.clone().into_iter(); - for orphan in iter { - if orphan.index < cut_off.index { - self.orphans.remove(&orphan); - blocks_to_prune.push(orphan); - } - } - - for confirmed_block in canonical_segment[6..].into_iter() { - let block = match self.block_store.remove(confirmed_block) { - None => { - ctx.try_log(|logger| { - slog::error!(logger, "unable to retrieve data for {}", confirmed_block) - }); - return; - } - Some(block) => block, - }; - confirmed_blocks.push(block); - } - - // Prune data - for block_to_prune in blocks_to_prune { - self.block_store.remove(&block_to_prune); - } - for fork_id in forks_to_prune { - self.forks.remove(&fork_id); - } - confirmed_blocks.reverse(); - } - - pub fn generate_block_chain_event( - &mut self, - canonical_segment: &ChainSegment, - other_segment: &ChainSegment, - ctx: &Context, - ) -> Result { - if other_segment.is_empty() { - let mut new_blocks = vec![]; - for i in 0..canonical_segment.block_ids.len() { - let block_identifier = - &canonical_segment.block_ids[canonical_segment.block_ids.len() - 1 - i]; - let block = match self.block_store.get(block_identifier) { - Some(block) => block.clone(), - None => { - ctx.try_log(|logger| { - slog::error!( - logger, - "unable to retrive Bitcoin {} from block store", - block_identifier - ) - }); - return Err(ChainSegmentIncompatibility::Unknown); - } - }; - new_blocks.push(block) - } - return Ok(BitcoinChainEvent::ChainUpdatedWithBlocks( - BitcoinChainUpdatedWithBlocksData { - new_blocks, - confirmed_blocks: vec![], - }, - )); - } - if let Ok(divergence) = canonical_segment.try_identify_divergence(other_segment, false, ctx) - { - if divergence.block_ids_to_rollback.is_empty() { - let mut new_blocks = vec![]; - for i in 0..divergence.block_ids_to_apply.len() { - let block_identifier = &divergence.block_ids_to_apply[i]; - let block = match self.block_store.get(block_identifier) { - Some(block) => block.clone(), - None => panic!("unable to retrive block from block store"), - }; - new_blocks.push(block) - } - return Ok(BitcoinChainEvent::ChainUpdatedWithBlocks( - BitcoinChainUpdatedWithBlocksData { - new_blocks, - confirmed_blocks: vec![], - }, - )); - } else { - return Ok(BitcoinChainEvent::ChainUpdatedWithReorg( - BitcoinChainUpdatedWithReorgData { - blocks_to_rollback: divergence - .block_ids_to_rollback - .iter() - .map(|block_id| { - let block = match self.block_store.get(block_id) { - Some(block) => block.clone(), - None => panic!("unable to retrive block from block store"), - }; - block - }) - .collect::>(), - blocks_to_apply: divergence - .block_ids_to_apply - .iter() - .map(|block_id| { - let block = match self.block_store.get(block_id) { - Some(block) => block.clone(), - None => panic!("unable to retrive block from block store"), - }; - block - }) - .collect::>(), - confirmed_blocks: vec![], - }, - )); - } - } - ctx.try_log(|logger| { - slog::debug!( - logger, - "Unable to infer chain event out of {} and {}", - canonical_segment, - other_segment - ) - }); - Err(ChainSegmentIncompatibility::ParentBlockUnknown) - } -} diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index a6014f4a8..3bdf00718 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -1,5 +1,3 @@ -mod blocks_pool; - use std::time::Duration; use crate::chainhooks::types::{ @@ -11,7 +9,6 @@ use crate::utils::Context; use bitcoincore_rpc::bitcoin::hashes::Hash; use bitcoincore_rpc::bitcoin::{self, Address, Amount, BlockHash}; use bitcoincore_rpc_json::GetRawTransactionResultVoutScriptPubKey; -pub use blocks_pool::BitcoinBlockPool; use chainhook_types::bitcoin::{OutPoint, TxIn, TxOut}; use chainhook_types::{ BitcoinBlockData, BitcoinBlockMetadata, BitcoinNetwork, BitcoinTransactionData, From 7006e0faeef728250d512ffcd4923a27754eef54 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 22 Aug 2023 13:49:52 +0200 Subject: [PATCH 34/99] test: revisit sidecar implem --- components/chainhook-sdk/src/observer/mod.rs | 263 +++++++--------- .../chainhook-sdk/src/observer/tests/mod.rs | 296 +++++++++++++++++- 2 files changed, 403 insertions(+), 156 deletions(-) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index df23772a7..acd516155 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -28,7 +28,6 @@ use chainhook_types::{ }; use hiro_system_kit; use hiro_system_kit::slog; -use reqwest::Client as HttpClient; use rocket::config::{self, Config, LogLevel}; use rocket::data::{Limits, ToByteUnit}; use rocket::serde::Deserialize; @@ -41,7 +40,7 @@ use std::str; use std::str::FromStr; use std::sync::mpsc::{Receiver, Sender}; use std::sync::{Arc, Mutex, RwLock}; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use std::time::{SystemTime, UNIX_EPOCH}; #[cfg(feature = "zeromq")] use zeromq::{Socket, SocketRecv}; @@ -61,64 +60,10 @@ pub enum Event { StacksChainEvent(StacksChainEvent), } -// TODO(lgalabru): Support for GRPC? -#[derive(Deserialize, Debug, Clone)] -pub enum EventHandler { - WebHook(String), -} - -impl EventHandler { - async fn propagate_stacks_event(&self, stacks_event: &StacksChainEvent) { - match self { - EventHandler::WebHook(host) => { - let path = "chain-events/stacks"; - let url = format!("{}/{}", host, path); - let body = rocket::serde::json::serde_json::to_vec(&stacks_event).unwrap_or(vec![]); - let http_client = HttpClient::builder() - .timeout(Duration::from_secs(20)) - .build() - .expect("Unable to build http client"); - let _ = http_client - .post(url) - .header("Content-Type", "application/json") - .body(body) - .send() - .await; - // TODO(lgalabru): handle response errors - } - } - } - - async fn propagate_bitcoin_event(&self, bitcoin_event: &BitcoinChainEvent) { - match self { - EventHandler::WebHook(host) => { - let path = "chain-events/bitcoin"; - let url = format!("{}/{}", host, path); - let body = - rocket::serde::json::serde_json::to_vec(&bitcoin_event).unwrap_or(vec![]); - let http_client = HttpClient::builder() - .timeout(Duration::from_secs(20)) - .build() - .expect("Unable to build http client"); - let _res = http_client - .post(url) - .header("Content-Type", "application/json") - .body(body) - .send() - .await; - // TODO(lgalabru): handle response errors - } - } - } - - async fn notify_bitcoin_transaction_proxied(&self) {} -} - #[derive(Debug, Clone)] pub struct EventObserverConfig { pub chainhook_config: Option, pub bitcoin_rpc_proxy_enabled: bool, - pub event_handlers: Vec, pub ingestion_port: u16, pub bitcoind_rpc_username: String, pub bitcoind_rpc_password: String, @@ -188,7 +133,6 @@ impl EventObserverConfig { let config = EventObserverConfig { bitcoin_rpc_proxy_enabled: false, - event_handlers: vec![], chainhook_config: None, ingestion_port: overrides .and_then(|c| c.ingestion_port) @@ -392,12 +336,69 @@ pub struct ObserverMetrics { pub stacks: ChainMetrics, } +pub struct ObserverSidecar { + bitcoin_block_mutator: Option<(Sender, Receiver)>, + bitcoin_chain_event_notifier: Option>, +} + +impl ObserverSidecar { + fn perform_bitcoin_sidecar_mutation( + &self, + block: BitcoinBlockData, + ctx: &Context, + ) -> (bool, BitcoinBlockData) { + if let Some(ref block_mutator) = self.bitcoin_block_mutator { + ctx.try_log(|logger| slog::info!(logger, "Sending blocks to pre-processor",)); + let _ = block_mutator.0.send(block.clone()); + ctx.try_log(|logger| slog::info!(logger, "Waiting for blocks from pre-processor",)); + match block_mutator.1.recv() { + Ok(updated_block) => { + ctx.try_log(|logger| slog::info!(logger, "Block received from pre-processor",)); + (true, updated_block) + } + Err(e) => { + ctx.try_log(|logger| { + slog::error!( + logger, + "Unable to receive block from pre-processor {}", + e.to_string() + ) + }); + (false, block) + } + } + } else { + (false, block) + } + } + + fn notify_chain_event(&self, chain_event: &BitcoinChainEvent, _ctx: &Context) { + if let Some(ref notifier) = self.bitcoin_chain_event_notifier { + match chain_event { + BitcoinChainEvent::ChainUpdatedWithBlocks(data) => { + for block in data.new_blocks.iter() { + let _ = notifier.send(HandleBlock::ApplyBlock(block.clone())); + } + } + BitcoinChainEvent::ChainUpdatedWithReorg(data) => { + for block in data.blocks_to_rollback.iter() { + let _ = notifier.send(HandleBlock::UndoBlock(block.clone())); + } + for block in data.blocks_to_apply.iter() { + let _ = notifier.send(HandleBlock::ApplyBlock(block.clone())); + } + } + } + } + } +} + pub fn start_event_observer( config: EventObserverConfig, observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver)>, + observer_sidecar: Option, ctx: Context, ) -> Result<(), Box> { match config.bitcoin_block_signaling { @@ -414,7 +415,7 @@ pub fn start_event_observer( observer_commands_tx_moved, observer_commands_rx, observer_events_tx, - block_pre_processor, + observer_sidecar, context_cloned, ); let _ = hiro_system_kit::nestable_block_on(future); @@ -431,7 +432,7 @@ pub fn start_event_observer( observer_commands_tx_moved, observer_commands_rx, observer_events_tx, - block_pre_processor, + observer_sidecar, context_cloned, ); let _ = hiro_system_kit::nestable_block_on(future); @@ -458,7 +459,7 @@ pub async fn start_bitcoin_event_observer( observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver)>, + observer_sidecar: Option, ctx: Context, ) -> Result<(), Box> { let chainhook_store = ChainhookStore::new(); @@ -485,7 +486,7 @@ pub async fn start_bitcoin_event_observer( observer_events_tx, None, observer_metrics_rw_lock.clone(), - block_pre_processor, + observer_sidecar, ctx, ) .await @@ -496,7 +497,7 @@ pub async fn start_stacks_event_observer( observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, - block_pre_processor: Option<(Sender, Receiver)>, + observer_sidecar: Option, ctx: Context, ) -> Result<(), Box> { let indexer_config = IndexerConfig { @@ -613,7 +614,7 @@ pub async fn start_stacks_event_observer( observer_events_tx, ingestion_shutdown, observer_metrics_rw_lock.clone(), - block_pre_processor, + observer_sidecar, ctx, ) .await @@ -765,8 +766,7 @@ pub fn start_zeromq_runloop( // \ B2 (4) - C2 (5) - D2 (6) // When D2 is being discovered (making A -> B2 -> C2 -> D2 the new canonical fork) // it looks like ZMQ is only publishing D2. - // Without additional operation, we end up with a block that with a block that we - // can't handle. + // Without additional operation, we end up with a block that we can't append. let parent_block_hash = header.parent_block_identifier.get_hash_bytes_str().to_string(); ctx_moved.try_log(|logger| { slog::info!( @@ -785,12 +785,6 @@ pub fn start_zeromq_runloop( } } -pub fn pre_process_bitcoin_block() {} - -pub fn apply_bitcoin_block() {} - -pub fn rollback_bitcoin_block() {} - pub fn gather_proofs<'a>( trigger: &BitcoinTriggerChainhook<'a>, proofs: &mut HashMap<&'a TransactionIdentifier, String>, @@ -834,8 +828,8 @@ pub fn gather_proofs<'a>( } pub enum HandleBlock { - ApplyBlocks(BitcoinBlockData), - UndoBlocks(BitcoinBlockData), + ApplyBlock(BitcoinBlockData), + UndoBlock(BitcoinBlockData), } pub async fn start_observer_commands_handler( @@ -845,13 +839,13 @@ pub async fn start_observer_commands_handler( observer_events_tx: Option>, ingestion_shutdown: Option, observer_metrics: Arc>, - block_pre_processor: Option<(Sender, Receiver)>, + observer_sidecar: Option, ctx: Context, ) -> Result<(), Box> { let mut chainhooks_occurrences_tracker: HashMap = HashMap::new(); - let event_handlers = config.event_handlers.clone(); let networks = (&config.bitcoin_network, &config.stacks_network); - let mut bitcoin_block_store: HashMap = HashMap::new(); + let mut bitcoin_block_store: HashMap = + HashMap::new(); let http_client = build_http_client(); loop { @@ -929,10 +923,10 @@ pub async fn start_observer_commands_handler( slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) }), }; - bitcoin_block_store.insert(new_block.block_identifier.clone(), new_block); + bitcoin_block_store.insert(new_block.block_identifier.clone(), (new_block, false)); } ObserverCommand::CacheBitcoinBlock(block) => { - bitcoin_block_store.insert(block.block_identifier.clone(), block); + bitcoin_block_store.insert(block.block_identifier.clone(), (block, false)); } ObserverCommand::PropagateBitcoinChainEvent(blockchain_event) => { ctx.try_log(|logger| { @@ -946,23 +940,28 @@ pub async fn start_observer_commands_handler( let mut new_blocks = vec![]; for header in data.new_headers.iter() { - match bitcoin_block_store.remove(&header.block_identifier) { - Some(block) => { + match ( + bitcoin_block_store.remove(&header.block_identifier), + &observer_sidecar, + ) { + (Some((block, false)), Some(sidecar)) => { // Time for pre-processing - let (_updated, updated_block) = handle_block_pre_processing( - &block_pre_processor, - block, - true, - &ctx, - ); - // Keep a copy of the pre-processed version + let (updated, updated_block) = + sidecar.perform_bitcoin_sidecar_mutation(block, &ctx); bitcoin_block_store.insert( updated_block.block_identifier.clone(), - updated_block.clone(), + (updated_block.clone(), updated), ); new_blocks.push(updated_block); } - None => { + (Some((block, _)), _) => { + bitcoin_block_store.insert( + block.block_identifier.clone(), + (block.clone(), true), + ); + new_blocks.push(block); + } + (None, _) => { ctx.try_log(|logger| { slog::error!( logger, @@ -976,7 +975,7 @@ pub async fn start_observer_commands_handler( for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { - Some(block) => { + Some((block, _)) => { confirmed_blocks.push(block); } None => { @@ -1018,21 +1017,9 @@ pub async fn start_observer_commands_handler( }); for header in data.headers_to_rollback.iter() { - match bitcoin_block_store.remove(&header.block_identifier) { - Some(block) => { - // Time for pre-processing - let (_updated, updated_block) = handle_block_pre_processing( - &block_pre_processor, - block, - false, - &ctx, - ); - // Keep a copy of the pre-processed version - bitcoin_block_store.insert( - updated_block.block_identifier.clone(), - updated_block.clone(), - ); - blocks_to_rollback.push(updated_block); + match bitcoin_block_store.get(&header.block_identifier) { + Some((block, _)) => { + blocks_to_rollback.push(block.clone()); } None => { ctx.try_log(|logger| { @@ -1047,23 +1034,28 @@ pub async fn start_observer_commands_handler( } for header in data.headers_to_apply.iter() { - match bitcoin_block_store.remove(&header.block_identifier) { - Some(block) => { + match ( + bitcoin_block_store.remove(&header.block_identifier), + &observer_sidecar, + ) { + (Some((block, false)), Some(sidecar)) => { // Time for pre-processing - let (_updated, updated_block) = handle_block_pre_processing( - &block_pre_processor, - block, - true, - &ctx, - ); - // Keep a copy of the pre-processed version + let (updated, updated_block) = + sidecar.perform_bitcoin_sidecar_mutation(block, &ctx); bitcoin_block_store.insert( updated_block.block_identifier.clone(), - updated_block.clone(), + (updated_block.clone(), updated), ); blocks_to_apply.push(updated_block); } - None => { + (Some((block, _)), _) => { + bitcoin_block_store.insert( + block.block_identifier.clone(), + (block.clone(), true), + ); + blocks_to_apply.push(block); + } + (None, _) => { ctx.try_log(|logger| { slog::error!( logger, @@ -1077,7 +1069,7 @@ pub async fn start_observer_commands_handler( for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { - Some(block) => { + Some((block, _)) => { confirmed_blocks.push(block); } None => { @@ -1123,6 +1115,8 @@ pub async fn start_observer_commands_handler( } }; + if let Some(ref sidecar) = observer_sidecar { + sidecar.notify_chain_event(&chain_event, &ctx) } // process hooks let mut hooks_ids_to_deregister = vec![]; @@ -1571,38 +1565,5 @@ pub async fn start_observer_commands_handler( Ok(()) } -fn handle_block_pre_processing( - block_pre_processor: &Option<(Sender, Receiver)>, - block: BitcoinBlockData, - apply: bool, - ctx: &Context, -) -> (bool, BitcoinBlockData) { - if let Some(ref processor) = block_pre_processor { - ctx.try_log(|logger| slog::info!(logger, "Sending blocks to pre-processor",)); - let _ = processor.0.send(match apply { - true => HandleBlock::ApplyBlocks(block.clone()), - false => HandleBlock::UndoBlocks(block.clone()), - }); - ctx.try_log(|logger| slog::info!(logger, "Waiting for blocks from pre-processor",)); - match processor.1.recv() { - Ok(updated_block) => { - ctx.try_log(|logger| slog::info!(logger, "Block received from pre-processor",)); - return (true, updated_block); - } - Err(e) => { - ctx.try_log(|logger| { - slog::error!( - logger, - "Unable to receive block from pre-processor {}", - e.to_string() - ) - }); - return (false, block); - } - } - } - return (false, block); -} - #[cfg(test)] pub mod tests; diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index 72a15cdd7..2c2353878 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -2,22 +2,24 @@ use crate::chainhooks::types::{ BitcoinChainhookFullSpecification, BitcoinChainhookNetworkSpecification, BitcoinChainhookSpecification, BitcoinPredicateType, ChainhookConfig, ChainhookFullSpecification, ChainhookSpecification, ExactMatchingRule, HookAction, - OutputPredicate, StacksChainhookFullSpecification, StacksChainhookNetworkSpecification, - StacksChainhookSpecification, StacksContractCallBasedPredicate, StacksPredicate, + OrdinalOperations, OutputPredicate, StacksChainhookFullSpecification, + StacksChainhookNetworkSpecification, StacksChainhookSpecification, + StacksContractCallBasedPredicate, StacksPredicate, }; +use crate::indexer::fork_scratch_pad::ForkScratchPad; use crate::indexer::tests::helpers::transactions::generate_test_tx_bitcoin_p2pkh_transfer; use crate::indexer::tests::helpers::{ accounts, bitcoin_blocks, stacks_blocks, transactions::generate_test_tx_stacks_contract_call, }; use crate::observer::{ start_observer_commands_handler, ChainhookStore, EventObserverConfig, ObserverCommand, - ObserverMetrics, + ObserverMetrics, ObserverSidecar, }; use crate::utils::{AbstractBlock, Context}; use chainhook_types::{ BitcoinBlockSignaling, BitcoinNetwork, BlockchainEvent, BlockchainUpdatedWithHeaders, - StacksBlockUpdate, StacksChainEvent, StacksChainUpdatedWithBlocksData, StacksNetwork, - StacksNodeConfig, + OrdinalInscriptionRevealData, OrdinalOperation, StacksBlockUpdate, StacksChainEvent, + StacksChainUpdatedWithBlocksData, StacksNetwork, StacksNodeConfig, BitcoinChainEvent, }; use hiro_system_kit; use std::collections::BTreeMap; @@ -115,6 +117,34 @@ fn bitcoin_chainhook_p2pkh( spec } +fn bitcoin_chainhook_ordinals(id: u8) -> BitcoinChainhookFullSpecification { + let mut networks = BTreeMap::new(); + networks.insert( + BitcoinNetwork::Regtest, + BitcoinChainhookNetworkSpecification { + start_block: None, + end_block: None, + blocks: None, + expire_after_occurrence: None, + predicate: BitcoinPredicateType::OrdinalsProtocol(OrdinalOperations::InscriptionFeed), + action: HookAction::Noop, + include_proof: None, + include_inputs: None, + include_outputs: None, + include_witness: None, + }, + ); + + let spec = BitcoinChainhookFullSpecification { + uuid: format!("{}", id), + name: format!("Chainhook {}", id), + owner_uuid: None, + version: 1, + networks, + }; + spec +} + fn generate_and_register_new_stacks_chainhook( observer_commands_tx: &Sender, observer_events_rx: &crossbeam_channel::Receiver, @@ -201,6 +231,37 @@ fn generate_and_register_new_bitcoin_chainhook( chainhook } +fn generate_and_register_new_ordinals_chainhook( + observer_commands_tx: &Sender, + observer_events_rx: &crossbeam_channel::Receiver, + id: u8, +) -> BitcoinChainhookSpecification { + let chainhook = bitcoin_chainhook_ordinals(id); + let _ = observer_commands_tx.send(ObserverCommand::RegisterPredicate( + ChainhookFullSpecification::Bitcoin(chainhook.clone()), + )); + let mut chainhook = chainhook + .into_selected_network_specification(&BitcoinNetwork::Regtest) + .unwrap(); + chainhook.enabled = true; + let _ = observer_commands_tx.send(ObserverCommand::EnablePredicate( + ChainhookSpecification::Bitcoin(chainhook.clone()), + )); + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::PredicateRegistered(_)) => { + true + } + _ => false, + }); + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::PredicateEnabled(_)) => { + true + } + _ => false, + }); + chainhook +} + #[test] fn test_stacks_chainhook_register_deregister() { let (observer_commands_tx, observer_commands_rx) = channel(); @@ -1158,3 +1219,228 @@ fn test_bitcoin_chainhook_auto_deregister() { let _ = observer_commands_tx.send(ObserverCommand::Terminate); handle.join().expect("unable to terminate thread"); } + +#[test] +fn test_bitcoin_chainhook_through_reorg() { + let (observer_commands_tx, observer_commands_rx) = channel(); + let (block_pre_processor_in_tx, block_pre_processor_in_rx) = channel(); + let (block_pre_processor_out_tx, block_pre_processor_out_rx) = channel(); + + let (observer_events_tx, observer_events_rx) = crossbeam_channel::unbounded(); + let observer_metrics_rw_lock = Arc::new(RwLock::new(ObserverMetrics::default())); + let observer_metrics_rw_lock_moved = observer_metrics_rw_lock.clone(); + + let empty_ctx = Context::empty(); + + let observer_sidecar = ObserverSidecar { + bitcoin_block_mutator: Some((block_pre_processor_in_tx, block_pre_processor_out_rx)), + bitcoin_chain_event_notifier: None, + }; + + let handle = std::thread::spawn(move || { + let (config, chainhook_store) = generate_test_config(); + let _ = hiro_system_kit::nestable_block_on(start_observer_commands_handler( + config, + chainhook_store, + observer_commands_rx, + Some(observer_events_tx), + None, + observer_metrics_rw_lock_moved, + Some(observer_sidecar), + Context::empty(), + )); + }); + + // The block pre-processor will simulate block augmentation with new informations, which should trigger + // registered predicates + let block_pre_processor_handle = std::thread::spawn(move || { + let mut cursor: u64 = 0; + while let Ok(mut block) = block_pre_processor_in_rx.recv() { + for (tx_index, tx) in block.transactions.iter_mut().enumerate() { + cursor += 1; + tx.metadata + .ordinal_operations + .push(OrdinalOperation::InscriptionRevealed( + OrdinalInscriptionRevealData { + content_bytes: format!("{cursor}"), + content_type: "".to_string(), + content_length: cursor as usize, + inscription_number: cursor as i64, + inscription_fee: cursor, + inscription_output_value: cursor, + inscription_id: format!("{cursor}"), + inscription_input_index: 0, + inscriber_address: None, + ordinal_number: cursor, + ordinal_block_height: block.block_identifier.index, + ordinal_offset: 0, + tx_index, + transfers_pre_inscription: cursor as u32, + satpoint_post_inscription: format!("{cursor}"), + curse_type: None, + }, + )) + } + let _ = block_pre_processor_out_tx.send(block); + } + }); + + let genesis = bitcoin_blocks::generate_test_bitcoin_block(0, 1, vec![], None); + let mut fork_pad = ForkScratchPad::new(); + let _ = fork_pad.process_header(genesis.get_header(), &empty_ctx); + + // Create and register a new chainhook (wallet_2 received some sats) + let _chainhook = + generate_and_register_new_ordinals_chainhook(&observer_commands_tx, &observer_events_rx, 1); + + // registering bitcoin chainhook should increment the observer_metric's registered bitcoin hooks + assert_eq!( + 1, + observer_metrics_rw_lock + .read() + .unwrap() + .bitcoin + .registered_predicates + ); + + // Simulate a block that does not include a trigger (wallet_1 to wallet_3) + let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( + 0, + &accounts::wallet_1_btc_address(), + &accounts::wallet_3_btc_address(), + 3, + )]; + let block = bitcoin_blocks::generate_test_bitcoin_block(0, 2, transactions, None); + let _ = observer_commands_tx.send(ObserverCommand::CacheBitcoinBlock(block.clone())); + + let chain_event = fork_pad + .process_header(block.get_header(), &empty_ctx) + .unwrap() + .unwrap(); + let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); + // Should signal that no hook were triggered + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::PredicatesTriggered(len)) => { + assert_eq!(len, 1); + true + } + Ok(event) => { + println!("Unexpected event: {:?}", event); + false + } + Err(e) => { + println!("Error: {:?}", e); + false + } + }); + + // 1) Should kick off predicate event + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinPredicateTriggered(payload)) => { + assert_eq!(payload.apply.len(), 1); + assert_eq!(payload.apply[0].block.transactions.len(), 1); + true + } + _ => false, + }); + + // 2) Should kick off bitcoin chain event + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinChainEvent((BitcoinChainEvent::ChainUpdatedWithBlocks(_), _))) => { + true + } + _ => false, + }); + + // Simulate a block that does include a trigger (wallet_1 to wallet_2) + let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( + 0, + &accounts::wallet_1_btc_address(), + &accounts::wallet_2_btc_address(), + 3, + )]; + let block = bitcoin_blocks::generate_test_bitcoin_block(1, 2, transactions, None); + let _ = observer_commands_tx.send(ObserverCommand::CacheBitcoinBlock(block.clone())); + let chain_event = fork_pad + .process_header(block.get_header(), &empty_ctx) + .unwrap() + .unwrap(); + let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); + + // Should signal that no hook were triggered + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::PredicatesTriggered(len)) => { + assert_eq!(len, 1); + true + } + _ => false, + }); + + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinPredicateTriggered(payload)) => { + assert_eq!(payload.rollback.len(), 1); + assert_eq!(payload.rollback[0].block.transactions.len(), 1); + assert_eq!(payload.apply.len(), 1); + assert_eq!(payload.apply[0].block.transactions.len(), 1); + true + } + _ => false, + }); + + // Should propagate chain event + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinChainEvent((BitcoinChainEvent::ChainUpdatedWithReorg(_), _))) => { + true + } + _ => false, + }); + + // Simulate a block that does include a trigger (wallet_1 to wallet_2) + let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( + 0, + &accounts::wallet_1_btc_address(), + &accounts::wallet_2_btc_address(), + 3, + )]; + let block = bitcoin_blocks::generate_test_bitcoin_block(0, 3, transactions, None); + let _ = observer_commands_tx.send(ObserverCommand::CacheBitcoinBlock(block.clone())); + let chain_event = fork_pad + .process_header(block.get_header(), &empty_ctx) + .unwrap() + .unwrap(); + let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); + + // Should signal that no hook were triggered + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::PredicatesTriggered(len)) => { + assert_eq!(len, 1); + true + } + _ => false, + }); + + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinPredicateTriggered(payload)) => { + assert_eq!(payload.rollback.len(), 1); + assert_eq!(payload.rollback[0].block.transactions.len(), 1); + assert_eq!(payload.apply.len(), 2); + assert_eq!(payload.apply[0].block.transactions.len(), 1); + true + } + _ => false, + }); + + // Should propagate block + assert!(match observer_events_rx.recv() { + Ok(ObserverEvent::BitcoinChainEvent((BitcoinChainEvent::ChainUpdatedWithReorg(_), _))) => { + true + } + _ => false, + }); + + let _ = observer_commands_tx.send(ObserverCommand::Terminate); + handle.join().expect("unable to terminate thread"); + block_pre_processor_handle + .join() + .expect("unable to terminate thread"); +} From 67a34dcb2f7dab546bb88bd1a6ed098109953531 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 22 Aug 2023 16:49:33 +0200 Subject: [PATCH 35/99] fix: revisit approach --- components/chainhook-sdk/src/observer/mod.rs | 202 +++++++++--------- .../chainhook-sdk/src/observer/tests/mod.rs | 63 +++--- 2 files changed, 136 insertions(+), 129 deletions(-) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index acd516155..6f73470b4 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -336,25 +336,37 @@ pub struct ObserverMetrics { pub stacks: ChainMetrics, } +#[derive(Debug, Clone)] +pub struct BitcoinBlockDataCached { + pub block: BitcoinBlockData, + pub processed_by_sidecar: bool, +} + pub struct ObserverSidecar { - bitcoin_block_mutator: Option<(Sender, Receiver)>, - bitcoin_chain_event_notifier: Option>, + pub bitcoin_blocks_mutator: Option<( + Sender<(Vec, Vec)>, + Receiver>, + )>, + pub bitcoin_chain_event_notifier: Option>, } impl ObserverSidecar { - fn perform_bitcoin_sidecar_mutation( + fn perform_bitcoin_sidecar_mutations( &self, - block: BitcoinBlockData, + blocks: Vec, + blocks_ids_to_rollback: Vec, ctx: &Context, - ) -> (bool, BitcoinBlockData) { - if let Some(ref block_mutator) = self.bitcoin_block_mutator { + ) -> Vec { + if let Some(ref block_mutator) = self.bitcoin_blocks_mutator { ctx.try_log(|logger| slog::info!(logger, "Sending blocks to pre-processor",)); - let _ = block_mutator.0.send(block.clone()); + let _ = block_mutator + .0 + .send((blocks.clone(), blocks_ids_to_rollback)); ctx.try_log(|logger| slog::info!(logger, "Waiting for blocks from pre-processor",)); match block_mutator.1.recv() { - Ok(updated_block) => { + Ok(updated_blocks) => { ctx.try_log(|logger| slog::info!(logger, "Block received from pre-processor",)); - (true, updated_block) + updated_blocks } Err(e) => { ctx.try_log(|logger| { @@ -364,11 +376,11 @@ impl ObserverSidecar { e.to_string() ) }); - (false, block) + blocks } } } else { - (false, block) + blocks } } @@ -844,9 +856,12 @@ pub async fn start_observer_commands_handler( ) -> Result<(), Box> { let mut chainhooks_occurrences_tracker: HashMap = HashMap::new(); let networks = (&config.bitcoin_network, &config.stacks_network); - let mut bitcoin_block_store: HashMap = - HashMap::new(); + let mut bitcoin_block_store: HashMap = HashMap::new(); let http_client = build_http_client(); + let store_update_required = observer_sidecar + .as_ref() + .and_then(|s| s.bitcoin_blocks_mutator.as_ref()) + .is_some(); loop { let command = match observer_commands_rx.recv() { @@ -872,7 +887,7 @@ pub async fn start_observer_commands_handler( } ObserverCommand::ProcessBitcoinBlock(mut block_data) => { let block_hash = block_data.hash.to_string(); - let new_block = loop { + let block = loop { match standardize_bitcoin_block( block_data.clone(), &config.bitcoin_network, @@ -910,8 +925,8 @@ pub async fn start_observer_commands_handler( }; match observer_metrics.write() { Ok(mut metrics) => { - if new_block.block_identifier.index > metrics.bitcoin.tip_height { - metrics.bitcoin.tip_height = new_block.block_identifier.index; + if block.block_identifier.index > metrics.bitcoin.tip_height { + metrics.bitcoin.tip_height = block.block_identifier.index; } metrics.bitcoin.last_block_ingestion_at = SystemTime::now() .duration_since(UNIX_EPOCH) @@ -923,10 +938,22 @@ pub async fn start_observer_commands_handler( slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) }), }; - bitcoin_block_store.insert(new_block.block_identifier.clone(), (new_block, false)); + bitcoin_block_store.insert( + block.block_identifier.clone(), + BitcoinBlockDataCached { + block, + processed_by_sidecar: false, + }, + ); } ObserverCommand::CacheBitcoinBlock(block) => { - bitcoin_block_store.insert(block.block_identifier.clone(), (block, false)); + bitcoin_block_store.insert( + block.block_identifier.clone(), + BitcoinBlockDataCached { + block, + processed_by_sidecar: false, + }, + ); } ObserverCommand::PropagateBitcoinChainEvent(blockchain_event) => { ctx.try_log(|logger| { @@ -937,46 +964,40 @@ pub async fn start_observer_commands_handler( // Update Chain event before propagation let chain_event = match blockchain_event { BlockchainEvent::BlockchainUpdatedWithHeaders(data) => { + let mut blocks_to_mutate = vec![]; let mut new_blocks = vec![]; for header in data.new_headers.iter() { - match ( - bitcoin_block_store.remove(&header.block_identifier), - &observer_sidecar, - ) { - (Some((block, false)), Some(sidecar)) => { - // Time for pre-processing - let (updated, updated_block) = - sidecar.perform_bitcoin_sidecar_mutation(block, &ctx); - bitcoin_block_store.insert( - updated_block.block_identifier.clone(), - (updated_block.clone(), updated), - ); - new_blocks.push(updated_block); - } - (Some((block, _)), _) => { - bitcoin_block_store.insert( - block.block_identifier.clone(), - (block.clone(), true), - ); - new_blocks.push(block); - } - (None, _) => { - ctx.try_log(|logger| { - slog::error!( - logger, - "Unable to retrieve bitcoin block {}", - header.block_identifier - ) - }); - } + if store_update_required { + let Some(block) = bitcoin_block_store.remove(&header.block_identifier) else { + continue; + }; + blocks_to_mutate.push(block); + } else { + let Some(cache) = bitcoin_block_store.get(&header.block_identifier) else { + continue; + }; + new_blocks.push(cache.block.clone()); + }; + } + + if let Some(ref sidecar) = observer_sidecar { + let updated_blocks = sidecar.perform_bitcoin_sidecar_mutations( + blocks_to_mutate, + vec![], + &ctx, + ); + for cache in updated_blocks.into_iter() { + bitcoin_block_store + .insert(cache.block.block_identifier.clone(), cache.clone()); + new_blocks.push(cache.block); } } for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { - Some((block, _)) => { - confirmed_blocks.push(block); + Some(res) => { + confirmed_blocks.push(res.block); } None => { ctx.try_log(|logger| { @@ -998,28 +1019,32 @@ pub async fn start_observer_commands_handler( ) } BlockchainEvent::BlockchainUpdatedWithReorg(data) => { - let mut blocks_to_apply = vec![]; let mut blocks_to_rollback = vec![]; - let blocks_ids_to_rollback = data - .headers_to_rollback - .iter() - .map(|b| b.block_identifier.index.to_string()) - .collect::>(); - let blocks_ids_to_apply = data - .headers_to_apply - .iter() - .map(|b| b.block_identifier.index.to_string()) - .collect::>(); + let mut blocks_to_mutate = vec![]; + let mut blocks_to_apply = vec![]; - ctx.try_log(|logger| { - slog::info!(logger, "Bitcoin reorg detected, will rollback blocks {} and apply blocks {}", blocks_ids_to_rollback.join(", "), blocks_ids_to_apply.join(", ")) - }); + for header in data.headers_to_apply.iter() { + if store_update_required { + let Some(block) = bitcoin_block_store.remove(&header.block_identifier) else { + continue; + }; + blocks_to_mutate.push(block); + } else { + let Some(cache) = bitcoin_block_store.get(&header.block_identifier) else { + continue; + }; + blocks_to_apply.push(cache.block.clone()); + }; + } + + let mut blocks_ids_to_rollback: Vec = vec![]; for header in data.headers_to_rollback.iter() { match bitcoin_block_store.get(&header.block_identifier) { - Some((block, _)) => { - blocks_to_rollback.push(block.clone()); + Some(cache) => { + blocks_ids_to_rollback.push(header.block_identifier.clone()); + blocks_to_rollback.push(cache.block.clone()); } None => { ctx.try_log(|logger| { @@ -1033,44 +1058,23 @@ pub async fn start_observer_commands_handler( } } - for header in data.headers_to_apply.iter() { - match ( - bitcoin_block_store.remove(&header.block_identifier), - &observer_sidecar, - ) { - (Some((block, false)), Some(sidecar)) => { - // Time for pre-processing - let (updated, updated_block) = - sidecar.perform_bitcoin_sidecar_mutation(block, &ctx); - bitcoin_block_store.insert( - updated_block.block_identifier.clone(), - (updated_block.clone(), updated), - ); - blocks_to_apply.push(updated_block); - } - (Some((block, _)), _) => { - bitcoin_block_store.insert( - block.block_identifier.clone(), - (block.clone(), true), - ); - blocks_to_apply.push(block); - } - (None, _) => { - ctx.try_log(|logger| { - slog::error!( - logger, - "Unable to retrieve bitcoin block {}", - header.block_identifier - ) - }); - } + if let Some(ref sidecar) = observer_sidecar { + let updated_blocks = sidecar.perform_bitcoin_sidecar_mutations( + blocks_to_mutate, + blocks_ids_to_rollback, + &ctx, + ); + for cache in updated_blocks.into_iter() { + bitcoin_block_store + .insert(cache.block.block_identifier.clone(), cache.clone()); + blocks_to_apply.push(cache.block); } } for header in data.confirmed_headers.iter() { match bitcoin_block_store.remove(&header.block_identifier) { - Some((block, _)) => { - confirmed_blocks.push(block); + Some(res) => { + confirmed_blocks.push(res.block); } None => { ctx.try_log(|logger| { diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index 2c2353878..f14e7d3d2 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -17,9 +17,10 @@ use crate::observer::{ }; use crate::utils::{AbstractBlock, Context}; use chainhook_types::{ - BitcoinBlockSignaling, BitcoinNetwork, BlockchainEvent, BlockchainUpdatedWithHeaders, - OrdinalInscriptionRevealData, OrdinalOperation, StacksBlockUpdate, StacksChainEvent, - StacksChainUpdatedWithBlocksData, StacksNetwork, StacksNodeConfig, BitcoinChainEvent, + BitcoinBlockSignaling, BitcoinChainEvent, BitcoinNetwork, BlockchainEvent, + BlockchainUpdatedWithHeaders, OrdinalInscriptionRevealData, OrdinalOperation, + StacksBlockUpdate, StacksChainEvent, StacksChainUpdatedWithBlocksData, StacksNetwork, + StacksNodeConfig, }; use hiro_system_kit; use std::collections::BTreeMap; @@ -1233,7 +1234,7 @@ fn test_bitcoin_chainhook_through_reorg() { let empty_ctx = Context::empty(); let observer_sidecar = ObserverSidecar { - bitcoin_block_mutator: Some((block_pre_processor_in_tx, block_pre_processor_out_rx)), + bitcoin_blocks_mutator: Some((block_pre_processor_in_tx, block_pre_processor_out_rx)), bitcoin_chain_event_notifier: None, }; @@ -1255,33 +1256,35 @@ fn test_bitcoin_chainhook_through_reorg() { // registered predicates let block_pre_processor_handle = std::thread::spawn(move || { let mut cursor: u64 = 0; - while let Ok(mut block) = block_pre_processor_in_rx.recv() { - for (tx_index, tx) in block.transactions.iter_mut().enumerate() { - cursor += 1; - tx.metadata - .ordinal_operations - .push(OrdinalOperation::InscriptionRevealed( - OrdinalInscriptionRevealData { - content_bytes: format!("{cursor}"), - content_type: "".to_string(), - content_length: cursor as usize, - inscription_number: cursor as i64, - inscription_fee: cursor, - inscription_output_value: cursor, - inscription_id: format!("{cursor}"), - inscription_input_index: 0, - inscriber_address: None, - ordinal_number: cursor, - ordinal_block_height: block.block_identifier.index, - ordinal_offset: 0, - tx_index, - transfers_pre_inscription: cursor as u32, - satpoint_post_inscription: format!("{cursor}"), - curse_type: None, - }, - )) + while let Ok((mut blocks, _)) = block_pre_processor_in_rx.recv() { + for b in blocks.iter_mut() { + for (tx_index, tx) in b.block.transactions.iter_mut().enumerate() { + cursor += 1; + tx.metadata + .ordinal_operations + .push(OrdinalOperation::InscriptionRevealed( + OrdinalInscriptionRevealData { + content_bytes: format!("{cursor}"), + content_type: "".to_string(), + content_length: cursor as usize, + inscription_number: cursor as i64, + inscription_fee: cursor, + inscription_output_value: cursor, + inscription_id: format!("{cursor}"), + inscription_input_index: 0, + inscriber_address: None, + ordinal_number: cursor, + ordinal_block_height: b.block.block_identifier.index, + ordinal_offset: 0, + tx_index, + transfers_pre_inscription: cursor as u32, + satpoint_post_inscription: format!("{cursor}"), + curse_type: None, + }, + )) + } } - let _ = block_pre_processor_out_tx.send(block); + let _ = block_pre_processor_out_tx.send(blocks); } }); From 6de4def719f68b5a4d692137272e8802b5873b80 Mon Sep 17 00:00:00 2001 From: Lavanya Kasturi Date: Tue, 22 Aug 2023 11:15:00 -0500 Subject: [PATCH 36/99] Update docs/how-to-guides/how-to-use-chainhooks-with-stacks.md Co-authored-by: Micaiah Reid --- docs/how-to-guides/how-to-use-chainhooks-with-stacks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md index 4d17caec0..8819aac54 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md @@ -101,6 +101,7 @@ Get any transaction emitting given print events predicate - `contract-identifier` mandatory argument admits: - string type, fully qualifying the contract to observe. Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09` + - Either the `contains` or `matches_regex` argument: - `contains` argument admits string type, used for matching an event containing the specified string. Example: `vault` - `matches_regex` argument admits string type that should be valid regex, used for matching an event that regex matches with the specified string. Example: `(?:^|\\W)vault(?:$|\\W)` From ea335530c174b8893013e6be7e0258285c4a9667 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 23 Aug 2023 10:00:54 +0200 Subject: [PATCH 37/99] fix: use crossbeam channels --- Cargo.lock | 6 +++--- components/chainhook-cli/Cargo.toml | 2 +- components/chainhook-sdk/Cargo.toml | 4 ++-- components/chainhook-sdk/src/observer/mod.rs | 9 +++++---- components/chainhook-sdk/src/observer/tests/mod.rs | 4 ++-- components/chainhook-types-rs/Cargo.toml | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f87fc1ad..a44e40aae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -457,13 +457,13 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.8.2" +version = "0.8.4" dependencies = [ "base58 0.2.0", "base64", "bitcoincore-rpc", "bitcoincore-rpc-json", - "chainhook-types 1.0.11", + "chainhook-types 1.0.12", "clarinet-utils", "crossbeam-channel 0.5.8", "dashmap 5.4.0", @@ -505,7 +505,7 @@ dependencies = [ [[package]] name = "chainhook-types" -version = "1.0.11" +version = "1.0.12" dependencies = [ "hex", "schemars 0.8.12", diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 77fb2c55d..1e0e88dc2 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -15,7 +15,7 @@ redis = "0.21.5" serde-redis = "0.12.0" hex = "0.4.3" rand = "0.8.5" -chainhook-sdk = { version = "0.8.2", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.8.4", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 923946362..243641462 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.2" +version = "0.8.4" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" @@ -18,7 +18,7 @@ hiro-system-kit = "0.1.0" # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } -chainhook-types = { version = "1.0.11", path = "../chainhook-types-rs" } +chainhook-types = { version = "1.0.12", path = "../chainhook-types-rs" } rocket = { version = "=0.5.0-rc.3", features = ["json"] } bitcoincore-rpc = "0.16.0" bitcoincore-rpc-json = "0.16.0" diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 6f73470b4..80a296826 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -32,7 +32,7 @@ use rocket::config::{self, Config, LogLevel}; use rocket::data::{Limits, ToByteUnit}; use rocket::serde::Deserialize; use rocket::Shutdown; -use std::collections::{BTreeMap, BTreeSet, HashMap, VecDeque}; +use std::collections::{BTreeMap, BTreeSet, HashMap}; use std::error::Error; use std::net::{IpAddr, Ipv4Addr}; use std::path::PathBuf; @@ -344,10 +344,10 @@ pub struct BitcoinBlockDataCached { pub struct ObserverSidecar { pub bitcoin_blocks_mutator: Option<( - Sender<(Vec, Vec)>, - Receiver>, + crossbeam_channel::Sender<(Vec, Vec)>, + crossbeam_channel::Receiver>, )>, - pub bitcoin_chain_event_notifier: Option>, + pub bitcoin_chain_event_notifier: Option>, } impl ObserverSidecar { @@ -662,6 +662,7 @@ pub fn start_zeromq_runloop( #[cfg(feature = "zeromq")] { use crate::indexer::fork_scratch_pad::ForkScratchPad; + use std::collections::VecDeque; if let BitcoinBlockSignaling::ZeroMQ(ref bitcoind_zmq_url) = config.bitcoin_block_signaling { diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index f14e7d3d2..b3eea713e 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -1224,8 +1224,8 @@ fn test_bitcoin_chainhook_auto_deregister() { #[test] fn test_bitcoin_chainhook_through_reorg() { let (observer_commands_tx, observer_commands_rx) = channel(); - let (block_pre_processor_in_tx, block_pre_processor_in_rx) = channel(); - let (block_pre_processor_out_tx, block_pre_processor_out_rx) = channel(); + let (block_pre_processor_in_tx, block_pre_processor_in_rx) = crossbeam_channel::unbounded(); + let (block_pre_processor_out_tx, block_pre_processor_out_rx) = crossbeam_channel::unbounded(); let (observer_events_tx, observer_events_rx) = crossbeam_channel::unbounded(); let observer_metrics_rw_lock = Arc::new(RwLock::new(ObserverMetrics::default())); diff --git a/components/chainhook-types-rs/Cargo.toml b/components/chainhook-types-rs/Cargo.toml index d4c97de44..de2f3263f 100644 --- a/components/chainhook-types-rs/Cargo.toml +++ b/components/chainhook-types-rs/Cargo.toml @@ -2,7 +2,7 @@ name = "chainhook-types" description = "Bitcoin and Stacks data schemas, based on the Rosetta specification" license = "MIT" -version = "1.0.11" +version = "1.0.12" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html From 293a907ed06be3b67e334f2350ca15ddd832b210 Mon Sep 17 00:00:00 2001 From: Lavanya Kasturi Date: Wed, 23 Aug 2023 10:03:18 -0500 Subject: [PATCH 38/99] Fixed formatting --- docs/how-to-guides/how-to-use-chainhooks-with-stacks.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md index 8819aac54..0a5b5c506 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md @@ -102,8 +102,8 @@ Get any transaction emitting given print events predicate - `contract-identifier` mandatory argument admits: - string type, fully qualifying the contract to observe. Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09` - Either the `contains` or `matches_regex` argument: - - `contains` argument admits string type, used for matching an event containing the specified string. Example: `vault` - - `matches_regex` argument admits string type that should be valid regex, used for matching an event that regex matches with the specified string. Example: `(?:^|\\W)vault(?:$|\\W)` + - `contains` argument admits string type, used for matching an event containing the specified string. Example: `vault` + - `matches_regex` argument admits string type that should be valid regex, used for matching an event that regex matches with the specified string. Example: `(?:^|\\W)vault(?:$|\\W)` The following example uses `contains` argument: @@ -135,7 +135,9 @@ Get any transaction calling a specific method for a given contract **directly**. > If the observed method is being called by another contract, this predicate won't detect it. - `contract-identifier` mandatory argument admits: - - string type, fully qualifying the contract to observe. Example: `SP000000000000000000002Q6VF78.pox` `method` mandatory argument admits: - string type, used for specifying the method to observe. Example: `stack-stx` + - string type, fully qualifying the contract to observe.Example: `SP000000000000000000002Q6VF78.pox` +- `method` mandatory argument admits: + - string type, used for specifying the method to observe. Example: `stack-stx` ```json { @@ -165,7 +167,6 @@ Get any transaction, including a contract deployment implementing a given trait // coming soon - `implement-trait` mandatory argument admits: - - string type, fully qualifying the trait's shape to observe. Example: `ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.sip09-protocol` ```json From 5a809c63bec1c949314ecbd44ef1348286968dec Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sat, 26 Aug 2023 10:54:42 -0400 Subject: [PATCH 39/99] fix: chainhook not being registered --- components/chainhook-sdk/src/observer/mod.rs | 34 ++++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 80a296826..73ddaab9f 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -107,6 +107,23 @@ impl EventObserverConfig { bitcoin_config } + pub fn get_chainhook_store(&self) -> ChainhookStore { + let mut chainhook_store = ChainhookStore::new(); + // If authorization not required, we create a default ChainhookConfig + if let Some(ref chainhook_config) = self.chainhook_config { + let mut chainhook_config = chainhook_config.clone(); + chainhook_store + .predicates + .stacks_chainhooks + .append(&mut chainhook_config.stacks_chainhooks); + chainhook_store + .predicates + .bitcoin_chainhooks + .append(&mut chainhook_config.bitcoin_chainhooks); + } + chainhook_store + } + pub fn get_stacks_node_config(&self) -> &StacksNodeConfig { match self.bitcoin_block_signaling { BitcoinBlockSignaling::Stacks(ref config) => config, @@ -474,7 +491,7 @@ pub async fn start_bitcoin_event_observer( observer_sidecar: Option, ctx: Context, ) -> Result<(), Box> { - let chainhook_store = ChainhookStore::new(); + let chainhook_store = config.get_chainhook_store(); let observer_metrics = ObserverMetrics { bitcoin: ChainMetrics { @@ -505,7 +522,7 @@ pub async fn start_bitcoin_event_observer( } pub async fn start_stacks_event_observer( - mut config: EventObserverConfig, + config: EventObserverConfig, observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, @@ -537,18 +554,7 @@ pub async fn start_stacks_event_observer( let bitcoin_rpc_proxy_enabled = config.bitcoin_rpc_proxy_enabled; let bitcoin_config = config.get_bitcoin_config(); - let mut chainhook_store = ChainhookStore::new(); - // If authorization not required, we create a default ChainhookConfig - if let Some(ref mut initial_chainhook_config) = config.chainhook_config { - chainhook_store - .predicates - .stacks_chainhooks - .append(&mut initial_chainhook_config.stacks_chainhooks); - chainhook_store - .predicates - .bitcoin_chainhooks - .append(&mut initial_chainhook_config.bitcoin_chainhooks); - } + let chainhook_store = config.get_chainhook_store(); let indexer_rw_lock = Arc::new(RwLock::new(indexer)); From ee486f3571f97728d5305bdb72a303134fca1bf5 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sat, 26 Aug 2023 10:56:32 -0400 Subject: [PATCH 40/99] feat: introduce "data_handler_tx" --- components/chainhook-sdk/src/observer/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 73ddaab9f..f29e97fd1 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -73,6 +73,7 @@ pub struct EventObserverConfig { pub cache_path: String, pub bitcoin_network: BitcoinNetwork, pub stacks_network: StacksNetwork, + pub data_handler_tx: Option>, } #[derive(Deserialize, Debug, Clone)] @@ -187,6 +188,7 @@ impl EventObserverConfig { .unwrap_or("cache".to_string()), bitcoin_network, stacks_network, + data_handler_tx: None, }; Ok(config) } From be0c22957b7345721e33d38e3bfa98794155e7a7 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sat, 26 Aug 2023 10:59:01 -0400 Subject: [PATCH 41/99] fix: build errro --- Cargo.lock | 2 +- components/chainhook-sdk/Cargo.toml | 2 +- components/chainhook-sdk/src/observer/tests/mod.rs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a44e40aae..e341088b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -457,7 +457,7 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.8.4" +version = "0.8.5" dependencies = [ "base58 0.2.0", "base64", diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 243641462..bec274936 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.4" +version = "0.8.5" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index b3eea713e..d9864fafd 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -44,6 +44,7 @@ fn generate_test_config() -> (EventObserverConfig, ChainhookStore) { cache_path: "cache".into(), bitcoin_network: BitcoinNetwork::Regtest, stacks_network: StacksNetwork::Devnet, + data_handler_tx: None, }; let predicates = ChainhookConfig::new(); let chainhook_store = ChainhookStore { predicates }; From 85d4d91ca6276a25d0bc95e256da356758155466 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sun, 27 Aug 2023 11:04:23 -0400 Subject: [PATCH 42/99] fix: build error --- components/chainhook-cli/src/config/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 7db407523..28eecfa3d 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -119,6 +119,7 @@ impl Config { cache_path: self.storage.working_dir.clone(), bitcoin_network: self.network.bitcoin_network.clone(), stacks_network: self.network.stacks_network.clone(), + data_handler_tx: None, } } From 4eb5a07ad350360f159b5443d0b2d665c20892bf Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sun, 27 Aug 2023 11:05:24 -0400 Subject: [PATCH 43/99] fix: migrate to finer zmq lib --- Cargo.lock | 509 +++++++++---------- components/chainhook-sdk/Cargo.toml | 6 +- components/chainhook-sdk/src/observer/mod.rs | 159 +----- components/chainhook-sdk/src/observer/zmq.rs | 157 ++++++ 4 files changed, 400 insertions(+), 431 deletions(-) create mode 100644 components/chainhook-sdk/src/observer/zmq.rs diff --git a/Cargo.lock b/Cargo.lock index e341088b8..2e3978907 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,15 +8,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "ahash" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217" -dependencies = [ - "const-random", -] - [[package]] name = "ahash" version = "0.7.6" @@ -114,19 +105,6 @@ dependencies = [ "syn 1.0.105", ] -[[package]] -name = "asynchronous-codec" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a0daa378f5fd10634e44b0a29b2a87b890657658e072a30d6f26e57ddee182" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite", -] - [[package]] name = "atomic" version = "0.5.1" @@ -403,10 +381,14 @@ dependencies = [ ] [[package]] -name = "cfg-if" -version = "0.1.10" +name = "cfg-expr" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "b40ccee03b5175c18cde8f37e7d2a33bcef6f8ec8f7cc0d81090d1bb380949c9" +dependencies = [ + "smallvec 1.10.0", + "target-lexicon", +] [[package]] name = "cfg-if" @@ -427,7 +409,7 @@ dependencies = [ "clarity-repl", "clarity-vm", "criterion", - "crossbeam-channel 0.5.8", + "crossbeam-channel", "csv", "ctrlc", "flate2", @@ -451,13 +433,13 @@ dependencies = [ "test-case", "threadpool", "tokio", - "toml", - "uuid 1.3.0", + "toml 0.5.9", + "uuid", ] [[package]] name = "chainhook-sdk" -version = "0.8.5" +version = "0.8.6" dependencies = [ "base58 0.2.0", "base64", @@ -465,8 +447,8 @@ dependencies = [ "bitcoincore-rpc-json", "chainhook-types 1.0.12", "clarinet-utils", - "crossbeam-channel 0.5.8", - "dashmap 5.4.0", + "crossbeam-channel", + "dashmap", "futures", "fxhash", "hex", @@ -486,7 +468,7 @@ dependencies = [ "test-case", "threadpool", "tokio", - "zeromq", + "zmq", ] [[package]] @@ -562,7 +544,7 @@ dependencies = [ "bitflags 1.3.2", "clap_derive", "clap_lex", - "indexmap", + "indexmap 1.9.2", "once_cell", "strsim", "termcolor", @@ -625,7 +607,7 @@ dependencies = [ "serde", "serde_derive", "tiny-hderive", - "toml", + "toml 0.5.9", "url", ] @@ -673,7 +655,7 @@ dependencies = [ "sha2 0.10.6", "sha3 0.9.1", "tokio", - "tokio-util 0.7.2", + "tokio-util", ] [[package]] @@ -740,28 +722,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "const-random" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368a7a772ead6ce7e1de82bfb04c485f3db8ec744f72925af5735e29a22cc18e" -dependencies = [ - "const-random-macro", - "proc-macro-hack", -] - -[[package]] -name = "const-random-macro" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d7d6ab3c3a2282db210df5f02c4dab6e0a7057af0fb7ebd4070f30fe05c0ddb" -dependencies = [ - "getrandom 0.2.8", - "once_cell", - "proc-macro-hack", - "tiny-keccak", -] - [[package]] name = "const_fn" version = "0.4.9" @@ -810,7 +770,7 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -851,26 +811,16 @@ dependencies = [ [[package]] name = "crossbeam" -version = "0.7.3" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" dependencies = [ - "cfg-if 0.1.10", - "crossbeam-channel 0.4.4", - "crossbeam-deque 0.7.4", - "crossbeam-epoch 0.8.2", + "cfg-if", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", "crossbeam-queue", - "crossbeam-utils 0.7.2", -] - -[[package]] -name = "crossbeam-channel" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" -dependencies = [ - "crossbeam-utils 0.7.2", - "maybe-uninit", + "crossbeam-utils", ] [[package]] @@ -879,19 +829,8 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils 0.8.14", -] - -[[package]] -name = "crossbeam-deque" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" -dependencies = [ - "crossbeam-epoch 0.8.2", - "crossbeam-utils 0.7.2", - "maybe-uninit", + "cfg-if", + "crossbeam-utils", ] [[package]] @@ -900,24 +839,9 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch 0.9.13", - "crossbeam-utils 0.8.14", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -dependencies = [ - "autocfg", - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "lazy_static", - "maybe-uninit", - "memoffset 0.5.6", - "scopeguard", + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] @@ -927,32 +851,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01a9af1f4c2ef74bb8aa1f7e19706bc72d03598c8a570bb5de72243c7a9d9d5a" dependencies = [ "autocfg", - "cfg-if 1.0.0", - "crossbeam-utils 0.8.14", + "cfg-if", + "crossbeam-utils", "memoffset 0.7.1", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" dependencies = [ - "autocfg", - "cfg-if 0.1.10", - "lazy_static", + "cfg-if", + "crossbeam-utils", ] [[package]] @@ -961,7 +873,7 @@ version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1124,28 +1036,17 @@ dependencies = [ "syn 1.0.105", ] -[[package]] -name = "dashmap" -version = "3.11.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f260e2fc850179ef410018660006951c1b55b79e8087e87111a2c388994b9b5" -dependencies = [ - "ahash 0.3.8", - "cfg-if 0.1.10", - "num_cpus", -] - [[package]] name = "dashmap" version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "hashbrown 0.12.3", "lock_api", "once_cell", - "parking_lot_core 0.9.5", + "parking_lot_core", ] [[package]] @@ -1221,13 +1122,24 @@ dependencies = [ "subtle 2.4.1", ] +[[package]] +name = "dircpy" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8466f8d28ca6da4c9dfbbef6ad4bff6f2fdd5e412d821025b0d3f0a9d74a8c1e" +dependencies = [ + "jwalk", + "log", + "walkdir", +] + [[package]] name = "dirs-next" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "dirs-sys-next", ] @@ -1285,7 +1197,7 @@ version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1295,15 +1207,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" [[package]] -name = "enum-primitive-derive" -version = "0.2.2" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e" -dependencies = [ - "num-traits", - "quote", - "syn 1.0.105", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" @@ -1380,7 +1287,7 @@ version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb21c69b9fea5e15dbc1049e4b77145dd0ba1c84019c488102de0dc4ea4b0a27" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "rustix 0.36.5", "windows-sys 0.42.0", ] @@ -1394,7 +1301,7 @@ dependencies = [ "atomic", "pear", "serde", - "toml", + "toml 0.5.9", "uncased", "version_check", ] @@ -1405,7 +1312,7 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e884668cd0c7480504233e951174ddc3b382f7c2666e3b7310b5c4e7b0c37f9" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "windows-sys 0.42.0", @@ -1600,7 +1507,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -1611,7 +1518,7 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -1636,10 +1543,10 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.2", "slab", "tokio", - "tokio-util 0.7.2", + "tokio-util", "tracing", ] @@ -1655,7 +1562,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash", ] [[package]] @@ -1664,6 +1571,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "hashlink" version = "0.7.0" @@ -1914,6 +1827,16 @@ dependencies = [ "serde", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "inlinable_string" version = "0.1.15" @@ -1926,7 +1849,7 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2012,6 +1935,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "jwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2735847566356cd2179a2a38264839308f7079fa96e6bd5a42d740460e003c56" +dependencies = [ + "crossbeam", + "rayon", +] + [[package]] name = "keccak" version = "0.1.3" @@ -2045,7 +1978,7 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] @@ -2187,7 +2120,7 @@ version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -2196,7 +2129,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "generator", "scoped-tls", "serde", @@ -2236,15 +2169,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "memoffset" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.6.5" @@ -2318,7 +2242,7 @@ dependencies = [ "mime", "spin 0.9.4", "tokio", - "tokio-util 0.7.2", + "tokio-util", "version_check", ] @@ -2366,7 +2290,7 @@ checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" dependencies = [ "bitflags 1.3.2", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "memoffset 0.6.5", ] @@ -2379,7 +2303,7 @@ checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ "autocfg", "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "libc", ] @@ -2479,7 +2403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "foreign-types", "libc", "once_cell", @@ -2529,17 +2453,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -2547,21 +2460,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.5", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec 1.10.0", - "winapi", + "parking_lot_core", ] [[package]] @@ -2570,7 +2469,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "redox_syscall", "smallvec 1.10.0", @@ -2923,9 +2822,9 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ - "crossbeam-channel 0.5.8", - "crossbeam-deque 0.8.2", - "crossbeam-utils 0.8.14", + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", "num_cpus", ] @@ -3070,7 +2969,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-rustls", - "tokio-util 0.7.2", + "tokio-util", "tower-service", "url", "wasm-bindgen", @@ -3118,13 +3017,13 @@ dependencies = [ "either", "figment", "futures", - "indexmap", + "indexmap 1.9.2", "is-terminal", "log", "memchr", "multer", "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "rand 0.8.5", "ref-cast", @@ -3137,7 +3036,7 @@ dependencies = [ "time 0.3.17", "tokio", "tokio-stream", - "tokio-util 0.7.2", + "tokio-util", "ubyte", "version_check", "yansi", @@ -3151,7 +3050,7 @@ checksum = "7093353f14228c744982e409259fb54878ba9563d08214f2d880d59ff2fc508b" dependencies = [ "devise", "glob", - "indexmap", + "indexmap 1.9.2", "proc-macro2", "quote", "rocket_http", @@ -3170,7 +3069,7 @@ dependencies = [ "futures", "http", "hyper", - "indexmap", + "indexmap 1.9.2", "log", "memchr", "pear", @@ -3229,7 +3128,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2288c66aeafe3b2ed227c981f364f9968fa952ef0b30e84ada4486e7ee24d00a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "proc-macro2", "quote", "rustc_version 0.4.0", @@ -3358,7 +3257,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db7826789c0e25614b03e5a54a0717a86f9ff6e6e5247f92b369472869320039" dependencies = [ "bitflags 1.3.2", - "cfg-if 1.0.0", + "cfg-if", "clipboard-win", "dirs-next", "fd-lock", @@ -3418,11 +3317,11 @@ version = "0.8.12" source = "git+https://github.com/hirosystems/schemars.git?branch=feat-chainhook-fixes#15fdd4711700114d57c090aad62516593bd4ca6d" dependencies = [ "dyn-clone", - "indexmap", + "indexmap 1.9.2", "schemars_derive 0.8.12", "serde", "serde_json", - "uuid 1.3.0", + "uuid", ] [[package]] @@ -3631,6 +3530,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +dependencies = [ + "serde", +] + [[package]] name = "serde_stacker" version = "0.1.6" @@ -3659,11 +3567,11 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.4.0", + "dashmap", "futures", "lazy_static", "log", - "parking_lot 0.12.1", + "parking_lot", "serial_test_derive", ] @@ -3712,7 +3620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", @@ -3724,7 +3632,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest 0.10.6", ] @@ -3805,7 +3713,7 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "766c59b252e62a34651412870ff55d8c4e6d04df19b43eecb2703e417b097ffe" dependencies = [ - "crossbeam-channel 0.5.8", + "crossbeam-channel", "slog", "take_mut", "thread_local", @@ -3913,7 +3821,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" dependencies = [ "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "psm", "winapi", @@ -4099,6 +4007,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "system-deps" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +dependencies = [ + "cfg-expr", + "heck 0.4.0", + "pkg-config", + "toml 0.7.6", + "version-compare", +] + [[package]] name = "take_mut" version = "0.2.2" @@ -4116,13 +4037,19 @@ dependencies = [ "xattr", ] +[[package]] +name = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + [[package]] name = "tempfile" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "fastrand", "libc", "redox_syscall", @@ -4165,7 +4092,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d10394d5d1e27794f772b6fc854c7e91a2dc26e2cbf807ad523370c2a59c0cee" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "proc-macro-error", "proc-macro2", "quote", @@ -4329,15 +4256,6 @@ dependencies = [ "sha2 0.8.2", ] -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -4375,7 +4293,7 @@ dependencies = [ "memchr", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -4426,21 +4344,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.2" @@ -4461,8 +4364,42 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ - "indexmap", + "indexmap 1.9.2", + "serde", +] + +[[package]] +name = "toml" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +dependencies = [ + "indexmap 2.0.0", "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -4477,7 +4414,7 @@ version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4633,15 +4570,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.8", -] - [[package]] name = "uuid" version = "1.3.0" @@ -4664,6 +4592,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + [[package]] name = "version_check" version = "0.9.4" @@ -4715,7 +4649,7 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] @@ -4740,7 +4674,7 @@ version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -5044,6 +4978,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -5075,27 +5018,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" [[package]] -name = "zeromq" -version = "0.3.3" +name = "zeromq-src" +version = "0.2.6+4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667ece59294ccaf617fcf2e5decc9114a06427c1f68990028b9f12d322686bdc" +checksum = "fc120b771270365d5ed0dfb4baf1005f2243ae1ae83703265cb3504070f4160b" dependencies = [ - "async-trait", - "asynchronous-codec", - "bytes", - "crossbeam", - "dashmap 3.11.10", - "enum-primitive-derive", - "futures", - "futures-util", - "lazy_static", - "log", - "num-traits", - "parking_lot 0.11.2", - "rand 0.7.3", - "regex", - "thiserror", - "tokio", - "tokio-util 0.6.10", - "uuid 0.8.2", + "cc", + "dircpy", +] + +[[package]] +name = "zmq" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd3091dd571fb84a9b3e5e5c6a807d186c411c812c8618786c3c30e5349234e7" +dependencies = [ + "bitflags 1.3.2", + "libc", + "zmq-sys", +] + +[[package]] +name = "zmq-sys" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8351dc72494b4d7f5652a681c33634063bbad58046c1689e75270908fdc864" +dependencies = [ + "libc", + "system-deps", + "zeromq-src", ] diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index bec274936..c01767ae8 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.5" +version = "0.8.6" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" @@ -37,7 +37,7 @@ hyper = { version = "0.14.24", features = ["http1", "client"] } hex = "0.4.3" threadpool = "1.8.1" rand = "0.8.5" -zeromq = { version = "0.3.3", default-features = false, features = ["tokio-runtime", "tcp-transport"], optional = true } +zmq = { version = "0.10.0", optional = true } dashmap = "5.4.0" fxhash = "0.2.1" lazy_static = "1.4.0" @@ -51,5 +51,5 @@ test-case = "3.1.0" [features] default = ["log"] -zeromq = ["dep:zeromq"] +zeromq = ["zmq"] log = ["hiro-system-kit/log"] diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index f29e97fd1..8c8f033ff 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -1,4 +1,6 @@ mod http; +#[cfg(feature = "zeromq")] +mod zmq; use crate::chainhooks::bitcoin::{ evaluate_bitcoin_chainhooks_on_chain_event, handle_bitcoin_hook_action, @@ -41,8 +43,6 @@ use std::str::FromStr; use std::sync::mpsc::{Receiver, Sender}; use std::sync::{Arc, Mutex, RwLock}; use std::time::{SystemTime, UNIX_EPOCH}; -#[cfg(feature = "zeromq")] -use zeromq::{Socket, SocketRecv}; pub const DEFAULT_INGESTION_PORT: u16 = 20445; @@ -507,7 +507,15 @@ pub async fn start_bitcoin_event_observer( }; let observer_metrics_rw_lock = Arc::new(RwLock::new(observer_metrics)); - start_zeromq_runloop(&config, observer_commands_tx, &ctx); + #[cfg(feature = "zeromq")] + { + let ctx_moved = ctx.clone(); + let config_moved = config.clone(); + let _ = hiro_system_kit::thread_named("ZMQ handler").spawn(move || { + let future = zmq::start_zeromq_runloop(&config_moved, observer_commands_tx, &ctx_moved); + let _ = hiro_system_kit::nestable_block_on(future); + }); + } // This loop is used for handling background jobs, emitted by HTTP calls. start_observer_commands_handler( @@ -661,151 +669,6 @@ pub fn get_bitcoin_proof( } } -#[allow(unused_variables, unused_imports)] -pub fn start_zeromq_runloop( - config: &EventObserverConfig, - observer_commands_tx: Sender, - ctx: &Context, -) { - #[cfg(feature = "zeromq")] - { - use crate::indexer::fork_scratch_pad::ForkScratchPad; - use std::collections::VecDeque; - - if let BitcoinBlockSignaling::ZeroMQ(ref bitcoind_zmq_url) = config.bitcoin_block_signaling - { - let bitcoind_zmq_url = bitcoind_zmq_url.clone(); - let ctx_moved = ctx.clone(); - let bitcoin_config = config.get_bitcoin_config(); - let http_client = build_http_client(); - - hiro_system_kit::thread_named("Bitcoind zmq listener") - .spawn(move || { - ctx_moved.try_log(|logger| { - slog::info!( - logger, - "Waiting for ZMQ connection acknowledgment from bitcoind" - ) - }); - - let _: Result<(), Box> = - hiro_system_kit::nestable_block_on(async move { - let mut socket = zeromq::SubSocket::new(); - - socket - .connect(&bitcoind_zmq_url) - .await - .expect("Failed to connect"); - - socket.subscribe("").await?; - ctx_moved.try_log(|logger| { - slog::info!(logger, "Waiting for ZMQ messages from bitcoind") - }); - - let mut bitcoin_blocks_pool = ForkScratchPad::new(); - - loop { - let message = match socket.recv().await { - Ok(message) => message, - Err(e) => { - ctx_moved.try_log(|logger| { - slog::error!( - logger, - "Unable to receive ZMQ message: {}", - e.to_string() - ) - }); - continue; - } - }; - let block_hash = hex::encode(message.get(1).unwrap().to_vec()); - let mut block_hashes: VecDeque = VecDeque::new(); - block_hashes.push_front(block_hash); - - while let Some(block_hash) = block_hashes.pop_front() { - - let block = match download_and_parse_block_with_retry( - &http_client, - &block_hash, - &bitcoin_config, - &ctx_moved, - ) - .await - { - Ok(block) => block, - Err(e) => { - ctx_moved.try_log(|logger| { - slog::warn!( - logger, - "unable to download_and_parse_block: {}", - e.to_string() - ) - }); - continue; - } - }; - - let header = block.get_block_header(); - ctx_moved.try_log(|logger| { - slog::info!( - logger, - "Bitcoin block #{} dispatched for processing", - block.height - ) - }); - - let _ = observer_commands_tx - .send(ObserverCommand::ProcessBitcoinBlock(block)); - - if bitcoin_blocks_pool.can_process_header(&header) { - match bitcoin_blocks_pool.process_header(header, &ctx_moved) { - Ok(Some(event)) => { - let _ = observer_commands_tx - .send(ObserverCommand::PropagateBitcoinChainEvent(event)); - }, - Err(e) => { - ctx_moved.try_log(|logger| { - slog::warn!( - logger, - "Unable to append block: {:?}", e - ) - }); - } - Ok(None) => { - ctx_moved.try_log(|logger| { - slog::warn!( - logger, - "Unable to append block" - ) - }); - } - } - } else { - // Handle a behaviour specific to ZMQ usage in bitcoind. - // Considering a simple re-org: - // A (1) - B1 (2) - C1 (3) - // \ B2 (4) - C2 (5) - D2 (6) - // When D2 is being discovered (making A -> B2 -> C2 -> D2 the new canonical fork) - // it looks like ZMQ is only publishing D2. - // Without additional operation, we end up with a block that we can't append. - let parent_block_hash = header.parent_block_identifier.get_hash_bytes_str().to_string(); - ctx_moved.try_log(|logger| { - slog::info!( - logger, - "Possible re-org detected, retrieving parent block {parent_block_hash}" - ) - }); - block_hashes.push_front(parent_block_hash); - } - } - } - }); - }) - .expect("unable to spawn thread"); - } - } -} - pub fn gather_proofs<'a>( trigger: &BitcoinTriggerChainhook<'a>, proofs: &mut HashMap<&'a TransactionIdentifier, String>, diff --git a/components/chainhook-sdk/src/observer/zmq.rs b/components/chainhook-sdk/src/observer/zmq.rs new file mode 100644 index 000000000..70de3ff6e --- /dev/null +++ b/components/chainhook-sdk/src/observer/zmq.rs @@ -0,0 +1,157 @@ +use chainhook_types::BitcoinBlockSignaling; +use hiro_system_kit::slog; +use std::sync::mpsc::Sender; +use zmq::Socket; + +use crate::{ + indexer::{ + bitcoin::{build_http_client, download_and_parse_block_with_retry}, + fork_scratch_pad::ForkScratchPad, + }, + utils::Context, +}; +use std::collections::VecDeque; + +use super::{EventObserverConfig, ObserverCommand}; + +fn new_zmq_socket() -> Socket { + let context = zmq::Context::new(); + let socket = context.socket(zmq::SUB).unwrap(); + assert!(socket.set_subscribe(b"hashblock").is_ok()); + assert!(socket.set_rcvhwm(0).is_ok()); + // We override the OS default behavior: + assert!(socket.set_tcp_keepalive(1).is_ok()); + // The keepalive routine will wait for 10 minutes + assert!(socket.set_tcp_keepalive_idle(300).is_ok()); + // And then resend it every 30 seconds + assert!(socket.set_tcp_keepalive_intvl(30).is_ok()); + // 100 times + assert!(socket.set_tcp_keepalive_cnt(100).is_ok()); + socket +} + +pub async fn start_zeromq_runloop( + config: &EventObserverConfig, + observer_commands_tx: Sender, + ctx: &Context, +) { + let BitcoinBlockSignaling::ZeroMQ(ref bitcoind_zmq_url) = config.bitcoin_block_signaling else { + unreachable!() + }; + + let bitcoind_zmq_url = bitcoind_zmq_url.clone(); + let bitcoin_config = config.get_bitcoin_config(); + let http_client = build_http_client(); + + ctx.try_log(|logger| { + slog::info!( + logger, + "Waiting for ZMQ connection acknowledgment from bitcoind" + ) + }); + + let mut socket = new_zmq_socket(); + assert!(socket.connect(&bitcoind_zmq_url).is_ok()); + ctx.try_log(|logger| slog::info!(logger, "Waiting for ZMQ messages from bitcoind")); + + let mut bitcoin_blocks_pool = ForkScratchPad::new(); + + loop { + ctx.try_log(|logger| slog::info!(logger, "Loop")); + + let msg = match socket.recv_multipart(0) { + Ok(msg) => msg, + Err(e) => { + ctx.try_log(|logger| { + slog::error!(logger, "Unable to receive ZMQ message: {}", e.to_string()) + }); + socket = new_zmq_socket(); + assert!(socket.connect(&bitcoind_zmq_url).is_ok()); + continue; + } + }; + let (topic, data, _sequence) = (&msg[0], &msg[1], &msg[2]); + + if !topic.eq(b"hashblock") { + ctx.try_log(|logger| slog::error!(logger, "Topic not supported",)); + continue; + } + + let block_hash = hex::encode(data); + + ctx.try_log(|logger| slog::info!(logger, "Bitcoin block hash announced #{block_hash}",)); + + let mut block_hashes: VecDeque = VecDeque::new(); + block_hashes.push_front(block_hash); + + while let Some(block_hash) = block_hashes.pop_front() { + let block = match download_and_parse_block_with_retry( + &http_client, + &block_hash, + &bitcoin_config, + &ctx, + ) + .await + { + Ok(block) => block, + Err(e) => { + ctx.try_log(|logger| { + slog::warn!( + logger, + "unable to download_and_parse_block: {}", + e.to_string() + ) + }); + continue; + } + }; + + let header = block.get_block_header(); + ctx.try_log(|logger| { + slog::info!( + logger, + "Bitcoin block #{} dispatched for processing", + block.height + ) + }); + + let _ = observer_commands_tx.send(ObserverCommand::ProcessBitcoinBlock(block)); + + if bitcoin_blocks_pool.can_process_header(&header) { + match bitcoin_blocks_pool.process_header(header, &ctx) { + Ok(Some(event)) => { + let _ = observer_commands_tx + .send(ObserverCommand::PropagateBitcoinChainEvent(event)); + } + Err(e) => { + ctx.try_log(|logger| { + slog::warn!(logger, "Unable to append block: {:?}", e) + }); + } + Ok(None) => { + ctx.try_log(|logger| slog::warn!(logger, "Unable to append block")); + } + } + } else { + // Handle a behaviour specific to ZMQ usage in bitcoind. + // Considering a simple re-org: + // A (1) - B1 (2) - C1 (3) + // \ B2 (4) - C2 (5) - D2 (6) + // When D2 is being discovered (making A -> B2 -> C2 -> D2 the new canonical fork) + // it looks like ZMQ is only publishing D2. + // Without additional operation, we end up with a block that we can't append. + let parent_block_hash = header + .parent_block_identifier + .get_hash_bytes_str() + .to_string(); + ctx.try_log(|logger| { + slog::info!( + logger, + "Possible re-org detected, retrieving parent block {parent_block_hash}" + ) + }); + block_hashes.push_front(parent_block_hash); + } + } + } +} From e104bf0df95a967e52c5e088bab1a20544e10db7 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sun, 27 Aug 2023 11:07:56 -0400 Subject: [PATCH 44/99] chore: remove log --- components/chainhook-sdk/src/observer/zmq.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/chainhook-sdk/src/observer/zmq.rs b/components/chainhook-sdk/src/observer/zmq.rs index 70de3ff6e..360d5bbdd 100644 --- a/components/chainhook-sdk/src/observer/zmq.rs +++ b/components/chainhook-sdk/src/observer/zmq.rs @@ -57,8 +57,6 @@ pub async fn start_zeromq_runloop( let mut bitcoin_blocks_pool = ForkScratchPad::new(); loop { - ctx.try_log(|logger| slog::info!(logger, "Loop")); - let msg = match socket.recv_multipart(0) { Ok(msg) => msg, Err(e) => { From fc0966650a549133a68b1d5b4345b99e70d2d36a Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sun, 27 Aug 2023 11:14:21 -0400 Subject: [PATCH 45/99] chore: tweak keepalive config --- components/chainhook-sdk/src/observer/zmq.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/chainhook-sdk/src/observer/zmq.rs b/components/chainhook-sdk/src/observer/zmq.rs index 360d5bbdd..0f53cc740 100644 --- a/components/chainhook-sdk/src/observer/zmq.rs +++ b/components/chainhook-sdk/src/observer/zmq.rs @@ -21,12 +21,12 @@ fn new_zmq_socket() -> Socket { assert!(socket.set_rcvhwm(0).is_ok()); // We override the OS default behavior: assert!(socket.set_tcp_keepalive(1).is_ok()); - // The keepalive routine will wait for 10 minutes + // The keepalive routine will wait for 5 minutes assert!(socket.set_tcp_keepalive_idle(300).is_ok()); - // And then resend it every 30 seconds - assert!(socket.set_tcp_keepalive_intvl(30).is_ok()); - // 100 times - assert!(socket.set_tcp_keepalive_cnt(100).is_ok()); + // And then resend it every 60 seconds + assert!(socket.set_tcp_keepalive_intvl(60).is_ok()); + // 120 times + assert!(socket.set_tcp_keepalive_cnt(120).is_ok()); socket } From 4762798f3c9b24aa31957b154824b6150eca3314 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Sun, 27 Aug 2023 11:16:36 -0400 Subject: [PATCH 46/99] chore: build warnings --- components/chainhook-sdk/Cargo.toml | 2 +- components/chainhook-sdk/src/observer/mod.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index c01767ae8..3c2cc3d92 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.6" +version = "0.8.7" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 8c8f033ff..cfce3a6dc 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -487,7 +487,7 @@ pub fn start_event_observer( pub async fn start_bitcoin_event_observer( config: EventObserverConfig, - observer_commands_tx: Sender, + _observer_commands_tx: Sender, observer_commands_rx: Receiver, observer_events_tx: Option>, observer_sidecar: Option, @@ -512,7 +512,7 @@ pub async fn start_bitcoin_event_observer( let ctx_moved = ctx.clone(); let config_moved = config.clone(); let _ = hiro_system_kit::thread_named("ZMQ handler").spawn(move || { - let future = zmq::start_zeromq_runloop(&config_moved, observer_commands_tx, &ctx_moved); + let future = zmq::start_zeromq_runloop(&config_moved, _observer_commands_tx, &ctx_moved); let _ = hiro_system_kit::nestable_block_on(future); }); } From d6d1cf2e50f9a136538c6abaa239dcc482aad4de Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 29 Aug 2023 10:29:30 -0400 Subject: [PATCH 47/99] chore: tweak chainhook-sdk --- Cargo.lock | 2 +- components/chainhook-cli/Cargo.toml | 2 +- components/chainhook-sdk/Cargo.toml | 2 +- components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs | 4 ++-- components/chainhook-sdk/src/observer/mod.rs | 10 ++++++++-- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e3978907..764fe81b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -439,7 +439,7 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.8.6" +version = "0.9.0" dependencies = [ "base58 0.2.0", "base64", diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 1e0e88dc2..596c9ec98 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -15,7 +15,7 @@ redis = "0.21.5" serde-redis = "0.12.0" hex = "0.4.3" rand = "0.8.5" -chainhook-sdk = { version = "0.8.4", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.9.0", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 3c2cc3d92..96dd054ed 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.8.7" +version = "0.9.0" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index 1e971bebd..39485d1f9 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -24,12 +24,12 @@ pub struct BitcoinTriggerChainhook<'a> { pub rollback: Vec<(Vec<&'a BitcoinTransactionData>, &'a BitcoinBlockData)>, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] pub struct BitcoinApplyTransactionPayload { pub block: BitcoinBlockData, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] pub struct BitcoinRollbackTransactionPayload { pub block: BitcoinBlockData, } diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index cfce3a6dc..33f031d26 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -60,6 +60,11 @@ pub enum Event { StacksChainEvent(StacksChainEvent), } +pub enum DataHandlerEvent { + Process(BitcoinChainhookOccurrencePayload), + Terminate, +} + #[derive(Debug, Clone)] pub struct EventObserverConfig { pub chainhook_config: Option, @@ -73,7 +78,7 @@ pub struct EventObserverConfig { pub cache_path: String, pub bitcoin_network: BitcoinNetwork, pub stacks_network: StacksNetwork, - pub data_handler_tx: Option>, + pub data_handler_tx: Option>, } #[derive(Deserialize, Debug, Clone)] @@ -512,7 +517,8 @@ pub async fn start_bitcoin_event_observer( let ctx_moved = ctx.clone(); let config_moved = config.clone(); let _ = hiro_system_kit::thread_named("ZMQ handler").spawn(move || { - let future = zmq::start_zeromq_runloop(&config_moved, _observer_commands_tx, &ctx_moved); + let future = + zmq::start_zeromq_runloop(&config_moved, _observer_commands_tx, &ctx_moved); let _ = hiro_system_kit::nestable_block_on(future); }); } From d434c9362ec46b13f1a98d51f62d1c1938f70319 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 12 Sep 2023 17:49:31 -0400 Subject: [PATCH 48/99] fix: workflow --- .github/workflows/ci.yaml | 464 ++++---------------------------------- 1 file changed, 47 insertions(+), 417 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 347580607..3c2daec2c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,447 +1,77 @@ name: CI + on: - pull_request: push: branches: - - main - develop - - rc/next + - main + tags-ignore: + - "**" + paths-ignore: + - "**/CHANGELOG.md" + pull_request: workflow_dispatch: jobs: - pre_run: - name: Cancel previous runs + build-publish: runs-on: ubuntu-latest steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@ad6cb1b847ffb509a69b745b6ee2f1d14dfe14b8 + - uses: actions/checkout@v2 with: - access_token: ${{ github.token }} + token: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} + fetch-depth: 0 persist-credentials: false - get_release_info: - name: Get Release Info - runs-on: ubuntu-latest - needs: pre_run - outputs: - tag: ${{ steps.new_release_tag.outputs.TAG }} - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Get latest release - if: startsWith(github.ref, 'refs/heads/main') - id: release - uses: pozetroninc/github-action-get-latest-release@master - with: - repository: ${{ github.repository }} - excludes: prerelease, draft - - - name: Determine if release build - if: startsWith(github.ref, 'refs/heads/main') - id: new_release_tag - env: - LATEST_RELEASE: ${{ steps.release.outputs.release }} - run: | - CARGO_VERSION=v$(grep "version" components/chainhook-cli/Cargo.toml | head -n 1 | cut -d\" -f2) - if [[ "${CARGO_VERSION}" != "${LATEST_RELEASE}" ]]; then - echo "::set-output name=TAG::${CARGO_VERSION}" - echo "::warning::Will create release for version: ${CARGO_VERSION}" - else - echo "::warning::Will not create a release" - fi - - audit: - name: Audit and format - runs-on: ubuntu-latest - needs: pre_run - steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - components: rustfmt - override: true - - - name: Set Cargo file permissions - run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/ - - - name: Cache cargo - uses: actions/cache@v2 - with: - path: ~/.cargo/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - - name: Install dependencies - run: cargo install cargo-audit - - - name: Run audit - run: cargo audit --ignore RUSTSEC-2021-0076 --ignore RUSTSEC-2021-0119 --ignore RUSTSEC-2022-0028 --ignore RUSTSEC-2020-0071 --ignore RUSTSEC-2021-0124 --ignore RUSTSEC-2022-0040 --ignore RUSTSEC-2023-0018 - - - name: Run rustfmt - run: cargo fmt --all -- --check - - # test_coverage_cargo: - # name: Generate test coverage - # runs-on: ubuntu-latest - # needs: pre_run - # strategy: - # fail-fast: false - # matrix: - # include: - # - name: clarinet - # working-directory: components/clarinet-cli - # - name: clarity-repl - # working-directory: components/clarity-repl - # - name: chainhook-cli - # working-directory: components/chainhook-event-observer - # steps: - # - name: Checkout repository - # uses: actions/checkout@v3 - # with: - # submodules: recursive - - # - name: Install Rust toolchain stable - # uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable - # profile: minimal - # override: true - - # - name: Cache cargo - # uses: actions/cache@v2 - # id: cache-cargo - # with: - # path: | - # ~/.cargo/bin/ - # ~/.cargo/registry/index/ - # ~/.cargo/registry/cache/ - # ~/.cargo/git/db/ - # target/ - # key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - # - name: Install dependencies - # if: steps.cache-cargo.outputs.cache-hit != 'true' - # run: RUSTC_BOOTSTRAP=1 cargo install grcov - - # - name: Install Rust toolchain - # uses: actions-rs/toolchain@v1 - # with: - # toolchain: stable - # profile: minimal - # components: llvm-tools-preview - # override: true - - # - name: Unit Tests - # env: - # RUSTFLAGS: "-C instrument-coverage" - # LLVM_PROFILE_FILE: "${{ matrix.name }}-%p-%m.profraw" - # run: cargo build --package=clarinet-cli --locked && cargo test --package=clarinet-cli - - # - name: Generate coverage - # run: grcov . --binary-path ./target/debug/ -s . -t lcov --branch --ignore-not-existing --ignore "/*" -o lcov.info - - # # Run functional tests here in addition to the other jobs so we can fail fast - # # Since these tests are reached much earlier in the pipeline - # - name: Functional Tests - # if: matrix.name == 'clarinet' - # run: | - # for testdir in $(ls components/clarinet-cli/examples); do - # ./target/debug/clarinet test --manifest-path components/clarinet-cli/examples/${testdir}/Clarinet.toml - # done - - # - name: Upload coverage report - # uses: codecov/codecov-action@v1 - # with: - # flags: unittests - # name: ${{ matrix.name }} - # verbose: true - - dist_chainhook: - name: Build Chainhook Distributions - runs-on: ${{ matrix.os }} - needs: pre_run - # Related upstream issue: - # https://github.com/nagisa/rust_libloading/issues/61#issuecomment-607941377 - # - # env: - # CC: deny_c - - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - platform: linux - target: x86_64-unknown-linux-gnu - architecture: x64 - libc: glibc - - os: windows-latest - platform: windows - target: x86_64-pc-windows-msvc - architecture: x64 - - os: macos-latest - platform: darwin - target: x86_64-apple-darwin - architecture: x64 - - os: macos-latest - platform: darwin - target: aarch64-apple-darwin - architecture: arm64 - - steps: - - name: Configure git to use LF (Windows) - if: matrix.os == 'windows-latest' - run: | - git config --global core.autocrlf false - git config --global core.eol lf - - - name: Checkout repository - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Install Rust toolchain - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - target: ${{ matrix.target }} - profile: minimal - components: llvm-tools-preview - override: true - - - name: Install wix (Windows) - if: matrix.os == 'windows-latest' - run: cargo install cargo-wix - - - if: matrix.os != 'windows-latest' - run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/ - - - name: Cache cargo - uses: actions/cache@v2 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/${{ matrix.target }}/release/ - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - - # Set environment variables required from cross compiling from macos-x86_64 to macos-arm64 - - name: Configure macos-arm64 cross compile config - if: matrix.target == 'aarch64-apple-darwin' - run: | - echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV - echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV - - - name: Configure artifact names (libc) - if: ${{ matrix.libc }} - shell: bash - run: | - echo "SHORT_TARGET_NAME=${{ matrix.platform }}-${{ matrix.architecture }}-${{ matrix.libc }}" >> $GITHUB_ENV - echo "PRE_GYP_TARGET_NAME=${{ matrix.platform }}-${{ matrix.architecture }}-${{ matrix.libc }}" >> $GITHUB_ENV - - - name: Configure artifact names (not libc) - if: ${{ ! matrix.libc }} - shell: bash - run: | - echo "SHORT_TARGET_NAME=${{ matrix.platform }}-${{ matrix.architecture }}" >> $GITHUB_ENV - echo "PRE_GYP_TARGET_NAME=${{ matrix.platform }}-${{ matrix.architecture }}-unknown" >> $GITHUB_ENV - - - name: Build - Cargo - if: matrix.target != 'x86_64-unknown-linux-musl' - run: cargo build --release --features=telemetry --locked --target ${{ matrix.target }} - - - name: Code sign bin (Windows) - if: startsWith(github.ref, 'refs/heads/main') && matrix.os == 'windows-latest' - run: | - $certificate_file_name = "${env:TEMP}\certificate.pfx" - - $bytes_cert = [Convert]::FromBase64String('${{ secrets.WINDOWS_CODE_SIGNING_CERTIFICATE }}') - [IO.File]::WriteAllBytes(${certificate_file_name}, ${bytes_cert}) - - $signtool_path = ((Resolve-Path -Path "${env:ProgramFiles(x86)}/Windows Kits/10/bin/10*/x86").Path[-1]) + "/signtool.exe" - $bin_path = (Resolve-Path -Path "target/${{ matrix.target }}/release/chainhook.exe").Path - & ${signtool_path} sign ` - /d "Clarinet is a clarity runtime packaged as a command line tool, designed to facilitate smart contract understanding, development, testing and deployment." ` - /du "https://github.com/hirosystems/chainhook" ` - /tr http://timestamp.digicert.com ` - /td sha256 ` - /fd sha256 ` - -f "${certificate_file_name}" ` - -p "${{ secrets.WINDOWS_CODE_SIGNING_PASSWORD }}" ` - "${bin_path}" - - - name: Build Installer (Windows) - if: matrix.os == 'windows-latest' - run: cargo wix -v --no-build --nocapture -p chainhook-cli - - - name: Code sign installer (Windows) - if: startsWith(github.ref, 'refs/heads/main') && matrix.os == 'windows-latest' + - name: Cargo test run: | - $certificate_file_name = "${env:TEMP}\certificate.pfx" - - $bytes_cert = [Convert]::FromBase64String('${{ secrets.WINDOWS_CODE_SIGNING_CERTIFICATE }}') - [IO.File]::WriteAllBytes(${certificate_file_name}, ${bytes_cert}) - - $signtool_path = ((Resolve-Path -Path "${env:ProgramFiles(x86)}/Windows Kits/10/bin/10*/x86").Path[-1]) + "/signtool.exe" - $msi_path = (Resolve-Path -Path "target/wix/*.msi").Path - & ${signtool_path} sign ` - /d "Clarinet is a clarity runtime packaged as a command line tool, designed to facilitate smart contract understanding, development, testing and deployment." ` - /du "https://github.com/hirosystems/chainhook" ` - /tr http://timestamp.digicert.com ` - /td sha256 ` - /fd sha256 ` - -f "${certificate_file_name}" ` - -p "${{ secrets.WINDOWS_CODE_SIGNING_PASSWORD }}" ` - "${msi_path}" - - # Don't compress for Windows because winget can't yet unzip files - - name: Compress cargo artifact (Linux) - if: matrix.os != 'windows-latest' - run: tar -C target/${{ matrix.target }}/release -zcvf chainhook-${{ env.SHORT_TARGET_NAME }}.tar.gz chainhook - - - name: Rename cargo artifact (Windows) - if: matrix.os == 'windows-latest' - shell: bash - run: mv target/wix/*.msi chainhook-${{ env.SHORT_TARGET_NAME }}.msi - - # Separate uploads to prevent paths from being preserved - - name: Upload cargo artifacts (Linux) - if: matrix.os != 'windows-latest' - uses: actions/upload-artifact@v2 - with: - name: chainhook-${{ env.SHORT_TARGET_NAME }} - path: chainhook-${{ env.SHORT_TARGET_NAME }}.tar.gz - - - name: Upload cargo artifact (Windows) - if: matrix.os == 'windows-latest' - uses: actions/upload-artifact@v2 + rustup update + cargo check + cargo test --all + + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v3 + id: semantic + # Only run on non-PR events or only PRs that aren't from forks + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} + SEMANTIC_RELEASE_PACKAGE: ${{ github.event.repository.name }} with: - name: chainhook-${{ env.SHORT_TARGET_NAME }} - path: chainhook-${{ env.SHORT_TARGET_NAME }}.msi + semantic_version: 19 + extra_plugins: | + @semantic-release/changelog@6.0.3 + @semantic-release/git@10.0.1 + conventional-changelog-conventionalcommits@6.1.0 - - name: Unit Tests - Cargo - # can't easily run mac-arm64 tests in GH without native runners for that arch - if: matrix.target != 'aarch64-apple-darwin' - run: cargo test --release --locked --target ${{ matrix.target }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 - # - name: Functional Tests (Linux) - # # can't easily run mac-arm64 tests in GH without native runners for that arch - # if: matrix.os != 'windows-latest' && matrix.target != 'aarch64-apple-darwin' - # run: | - # for testdir in $(ls components/chainhook-cli/examples); do - # ./target/${{ matrix.target }}/release/clarinet test --manifest-path components/clarinet-cli/examples/${testdir}/Clarinet.toml - # done - - # - name: Functional Tests (Windows) - # if: matrix.os == 'windows-latest' - # run: | - # foreach($testdir in Get-ChildItem components/clarinet-cli/examples) { - # ./target/${{ matrix.target }}/release/clarinet test --manifest-path ${testdir}/Clarinet.toml - # } - - docker_images: - name: Create ${{ matrix.name }} Docker Image - runs-on: ubuntu-latest - needs: - - get_release_info - - dist_chainhook_node - outputs: - version: ${{ steps.docker_meta.outputs.version }} - strategy: - fail-fast: false - matrix: - include: - - name: Chainhook Node - description: A Stacks event observer. - image: ${{ github.repository_owner }}/chainhook-cli - artifact: chainhook-cli-linux-x64-glibc - dockerfile: dockerfiles/components/chainhook-cli.dockerfile - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Generate Docker tags/labels - id: docker_meta + - name: Docker Meta + id: meta uses: docker/metadata-action@v4 with: - images: ${{ matrix.image }} + images: | + blockstack/${{ github.event.repository.name }} + hirosystems/${{ github.event.repository.name }} tags: | type=ref,event=branch type=ref,event=pr - type=semver,pattern={{version}},value=${{ needs.get_release_info.outputs.tag }},enable=${{ needs.get_release_info.outputs.tag != '' }} - type=semver,pattern={{major}}.{{minor}},value=${{ needs.get_release_info.outputs.tag }},enable=${{ needs.get_release_info.outputs.tag != '' }} - labels: | - org.opencontainers.image.title=${{ matrix.name }} - org.opencontainers.image.description=${{ matrix.description }} + type=semver,pattern={{version}},value=${{ steps.semantic.outputs.new_release_version }},enable=${{ steps.semantic.outputs.new_release_version != '' }} + type=semver,pattern={{major}}.{{minor}},value=${{ steps.semantic.outputs.new_release_version }},enable=${{ steps.semantic.outputs.new_release_version != '' }} + type=raw,value=latest,enable={{is_default_branch}} - - name: Login to Dockerhub + - name: Login to DockerHub uses: docker/login-action@v2 - if: github.event_name != 'pull_request' with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Download pre-built dist - uses: actions/download-artifact@v3 - with: - name: ${{ matrix.artifact }} - - - name: Untar pre-built dist - run: tar zxvf *.tar.gz - - - name: Create Image - uses: docker/build-push-action@v3 + - name: Build/Tag/Push Image + uses: docker/build-push-action@v2 with: context: . - file: ${{ matrix.dockerfile }} - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.docker_meta.outputs.tags }} - labels: ${{ steps.docker_meta.outputs.labels }} - - release: - name: Release - runs-on: ubuntu-latest - if: startsWith(github.ref, 'refs/heads/main') && needs.get_release_info.outputs.tag != '' - needs: - - get_release_info - - audit - # - test_coverage_cargo - - docker_images - permissions: - actions: write - contents: write - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: recursive - - - name: Download pre-built dists - uses: actions/download-artifact@v3 - - - name: Tag and Release - uses: ncipollo/release-action@v1 - with: - artifacts: "**/*.tar.gz,**/*.msi" - tag: ${{ needs.get_release_info.outputs.tag }} - commit: ${{ env.GITHUB_SHA }} - - - name: Trigger pkg-version-bump workflow - uses: peter-evans/repository-dispatch@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - event-type: released - client-payload: '{"tag": "${{ needs.get_release_info.outputs.tag }}"}' + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + file: ./dockerfiles/components/chainhook.dockerfile + # Only push if (there's a new release on main branch, or if building a non-main branch) and (Only run on non-PR events or only PRs that aren't from forks) + push: ${{ (github.ref != 'refs/heads/master' || steps.semantic.outputs.new_release_version != '') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} From 15da6612d852089ecdcfd8831201c3722663e5bb Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 12 Sep 2023 17:49:54 -0400 Subject: [PATCH 49/99] chore: clean gitignore --- .gitignore | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 837e005db..06ccb5f4c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,16 +12,9 @@ npm-debug.log* **/.requirements **/.cache **/.build -components/stacks-devnet-js/dist -components/stacks-devnet-js/build components/chainhook-types-js/dist *.tar.gz *.zip *.rdb - -components/chainhook-db/examples/arkadiko-data-indexing/vault-monitor/bin -components/chainhook-db/examples/arkadiko-data-indexing/vault-monitor/tmp -components/chainhook-db/examples/arkadiko-data-indexing/vault-monitor/vendor -components/chainhook-cli/cache -components/chainhook-cli/index.redb +*.redb cache/ From a100263a0bcab3a43c9bbce49ddead754d2d621c Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Thu, 14 Sep 2023 11:39:58 -0400 Subject: [PATCH 50/99] feat: augment predicate status returned by GET/LIST endpoints (#397) ### Description This PR accomplishes a few things: - renames/adds/removes predicate statuses according to the flowchart in docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png - adds more context to errors returned in Interrupted status - adds status data to `GET /v1/chainhooks` endpoint - fixes bug in chainhook service where block streaming continued past `end_block` Fixes #396, fixes #324 Also: Improves how we handle a restart of `chainhook service` while predicates are scanning/streaming. Here are the cases we now handle: 1. Predicates that were in `scanning` status when Chainhook was terminated will resume scanning starting from their `last_evaluated_block_height`. *Note: because we only save predicate status every 10 scans, we could end up re-emiting matches on a resetart* 2. Predicates that were in `new` status when Chainhook was terminated will start scanning at the predicate's `start_block` 3. Predicates that were in `streaming` status will _return_ to a `scanning` status, starting at `last_evaluated_block_height` to catch up on the missed blocks. Note, the `number_of_blocks_to_scan` is set to 0 for this temporary catch-up, as it's difficult to compute the number of remaining blocks in the context of this change 4. If predicates were passed in at startup, we also register those to begin scanning, which previously didn't happen 5. We now allow passing in a predicate at startup _and_ registering additional predicates with the predicate registration server. This means that if you use the same startup predicate repeatedly, it will already be saved in redis and _not_ be reloaded. Fixes: #298, fixes #390, fixes #402, fixes #403 #### Breaking change? The rename of `ScanningData`'s `number_of_blocks_sent` field could technically be considered breaking, let's discuss. ### Checklist - [x] All tests pass - [x] Tests added in this PR (if applicable) Test coverage before: 23.2% Test coverage after: 37.72% --- .github/workflows/ci.yaml | 5 +- .gitignore | 2 + components/chainhook-cli/src/cli/mod.rs | 9 +- components/chainhook-cli/src/scan/bitcoin.rs | 165 +- components/chainhook-cli/src/scan/stacks.rs | 184 +- .../chainhook-cli/src/service/http_api.rs | 48 +- components/chainhook-cli/src/service/mod.rs | 712 +++++- .../chainhook-cli/src/service/runloops.rs | 40 +- .../src/service/tests/helpers.rs | 70 + .../chainhook-cli/src/service/tests/mod.rs | 309 ++- components/chainhook-cli/src/storage/mod.rs | 25 +- .../src/chainhooks/bitcoin/mod.rs | 65 +- .../src/chainhooks/stacks/mod.rs | 136 +- .../chainhook-sdk/src/chainhooks/tests/mod.rs | 15 +- .../chainhook-sdk/src/chainhooks/types.rs | 53 +- .../chainhook-sdk/src/indexer/stacks/mod.rs | 8 +- components/chainhook-sdk/src/observer/mod.rs | 130 +- .../chainhook-sdk/src/observer/tests/mod.rs | 470 ++-- components/chainhook-sdk/src/utils/mod.rs | 84 +- .../components/chainhook-node.dockerfile | 2 +- .../PredicateStatusFlowchart.excalidraw | 2106 +++++++++++++++++ .../PredicateStatusFlowchart.png | Bin 0 -> 512548 bytes rust-toolchain | 2 +- 23 files changed, 3994 insertions(+), 646 deletions(-) create mode 100644 components/chainhook-cli/src/service/tests/helpers.rs create mode 100644 docs/images/predicate-status-flowchart/PredicateStatusFlowchart.excalidraw create mode 100644 docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3c2daec2c..f0a1012bf 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,8 +25,7 @@ jobs: - name: Cargo test run: | rustup update - cargo check - cargo test --all + RUST_BACKTRACE=1 cargo test --all -- --test-threads=1 - name: Semantic Release uses: cycjimmy/semantic-release-action@v3 @@ -72,6 +71,6 @@ jobs: context: . tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - file: ./dockerfiles/components/chainhook.dockerfile + file: ./dockerfiles/components/chainhook-node.dockerfile # Only push if (there's a new release on main branch, or if building a non-main branch) and (Only run on non-PR events or only PRs that aren't from forks) push: ${{ (github.ref != 'refs/heads/master' || steps.semantic.outputs.new_release_version != '') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} diff --git a/.gitignore b/.gitignore index 06ccb5f4c..9f6f049ca 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ components/chainhook-types-js/dist *.rdb *.redb cache/ + +components/chainhook-cli/src/service/tests/fixtures/tmp \ No newline at end of file diff --git a/components/chainhook-cli/src/cli/mod.rs b/components/chainhook-cli/src/cli/mod.rs index 64f136478..a07a7aebc 100644 --- a/components/chainhook-cli/src/cli/mod.rs +++ b/components/chainhook-cli/src/cli/mod.rs @@ -1,5 +1,5 @@ use crate::config::generator::generate_config; -use crate::config::{Config, PredicatesApi}; +use crate::config::Config; use crate::scan::bitcoin::scan_bitcoin_chainstate_via_rpc_using_predicate; use crate::scan::stacks::{ consolidate_local_stacks_chainstate_using_csv, scan_stacks_chainstate_via_csv_using_predicate, @@ -291,12 +291,8 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { match opts.command { Command::Service(subcmd) => match subcmd { ServiceCommand::Start(cmd) => { - let mut config = + let config = Config::default(cmd.devnet, cmd.testnet, cmd.mainnet, &cmd.config_path)?; - // We disable the API if a predicate was passed, and the --enable- - if cmd.predicates_paths.len() > 0 && !cmd.start_http_api { - config.http_api = PredicatesApi::Off; - } let predicates = cmd .predicates_paths @@ -462,6 +458,7 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { scan_bitcoin_chainstate_via_rpc_using_predicate( &predicate_spec, + None, &config, &ctx, ) diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 2d9c6e003..b6cd43e1e 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -1,7 +1,7 @@ use crate::config::{Config, PredicatesApi}; use crate::service::{ - open_readwrite_predicates_db_conn_or_panic, update_predicate_status, PredicateStatus, - ScanningData, + open_readwrite_predicates_db_conn_or_panic, set_predicate_scanning_status, + set_unconfirmed_expiration_status, ScanningData, }; use chainhook_sdk::bitcoincore_rpc::RpcApi; use chainhook_sdk::bitcoincore_rpc::{Auth, Client}; @@ -16,16 +16,17 @@ use chainhook_sdk::indexer::bitcoin::{ }; use chainhook_sdk::observer::{gather_proofs, EventObserverConfig}; use chainhook_sdk::types::{ - BitcoinBlockData, BitcoinChainEvent, BitcoinChainUpdatedWithBlocksData, + BitcoinBlockData, BitcoinChainEvent, BitcoinChainUpdatedWithBlocksData, BlockIdentifier, Chain, }; use chainhook_sdk::utils::{file_append, send_request, BlockHeights, Context}; use std::collections::HashMap; pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( predicate_spec: &BitcoinChainhookSpecification, + unfinished_scan_data: Option, config: &Config, ctx: &Context, -) -> Result<(), String> { +) -> Result { let auth = Auth::UserPass( config.network.bitcoind_rpc_username.clone(), config.network.bitcoind_rpc_password.clone(), @@ -43,7 +44,10 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( BlockHeights::Blocks(blocks.clone()).get_sorted_entries() } else { let start_block = match predicate_spec.start_block { - Some(start_block) => start_block, + Some(start_block) => match &unfinished_scan_data { + Some(scan_data) => scan_data.last_evaluated_block_height, + None => start_block, + }, None => { return Err( "Bitcoin chainhook specification must include a field start_block in replay mode" @@ -51,35 +55,59 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( ); } }; - let (end_block, update_end_block) = match predicate_spec.end_block { - Some(end_block) => (end_block, false), - None => match bitcoin_rpc.get_blockchain_info() { - Ok(result) => (result.blocks, true), - Err(e) => { - return Err(format!( - "unable to retrieve Bitcoin chain tip ({})", - e.to_string() - )); + let (end_block, update_end_block) = match bitcoin_rpc.get_blockchain_info() { + Ok(result) => match predicate_spec.end_block { + Some(end_block) => { + if end_block > result.blocks { + (result.blocks, true) + } else { + (end_block, false) + } } + None => (result.blocks, true), }, + Err(e) => { + return Err(format!( + "unable to retrieve Bitcoin chain tip ({})", + e.to_string() + )); + } }; floating_end_block = update_end_block; BlockHeights::BlockRange(start_block, end_block).get_sorted_entries() }; + let mut predicates_db_conn = match config.http_api { + PredicatesApi::On(ref api_config) => { + Some(open_readwrite_predicates_db_conn_or_panic(api_config, ctx)) + } + PredicatesApi::Off => None, + }; + info!( ctx.expect_logger(), "Starting predicate evaluation on Bitcoin blocks", ); + let mut last_block_scanned = BlockIdentifier::default(); let mut actions_triggered = 0; let mut err_count = 0; let event_observer_config = config.get_event_observer_config(); let bitcoin_config = event_observer_config.get_bitcoin_config(); - let number_of_blocks_to_scan = block_heights_to_scan.len() as u64; - let mut number_of_blocks_scanned = 0; - let mut number_of_blocks_sent = 0u64; + + let (mut number_of_blocks_to_scan, mut number_of_blocks_scanned, mut number_of_times_triggered) = { + let number_of_blocks_to_scan = block_heights_to_scan.len() as u64; + match &unfinished_scan_data { + Some(scan_data) => ( + scan_data.number_of_blocks_to_scan, + scan_data.number_of_blocks_evaluated, + scan_data.number_of_times_triggered, + ), + None => (number_of_blocks_to_scan, 0, 0u64), + } + }; + let http_client = build_http_client(); while let Some(current_block_height) = block_heights_to_scan.pop_front() { @@ -109,8 +137,9 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( continue; } }; + last_block_scanned = block.block_identifier.clone(); - match process_block_with_predicates( + let res = match process_block_with_predicates( block, &vec![&predicate_spec], &event_observer_config, @@ -120,47 +149,63 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( { Ok(actions) => { if actions > 0 { - number_of_blocks_sent += 1; + number_of_times_triggered += 1; } - actions_triggered += actions + actions_triggered += actions; + Ok(()) } - Err(_) => err_count += 1, - } + Err(e) => { + err_count += 1; + Err(e) + } + }; if err_count >= 3 { - return Err(format!("Scan aborted (consecutive action errors >= 3)")); + if res.is_err() { + return Err(format!( + "Scan aborted (consecutive action errors >= 3): {}", + res.unwrap_err() + )); + } else { + return Err(format!("Scan aborted (consecutive action errors >= 3)")); + } } - if let PredicatesApi::On(ref api_config) = config.http_api { - if number_of_blocks_scanned % 50 == 0 { - let status = PredicateStatus::Scanning(ScanningData { + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + if number_of_blocks_scanned % 10 == 0 || number_of_blocks_scanned == 1 { + set_predicate_scanning_status( + &predicate_spec.key(), number_of_blocks_to_scan, number_of_blocks_scanned, - number_of_blocks_sent, + number_of_times_triggered, current_block_height, - }); - let mut predicates_db_conn = - open_readwrite_predicates_db_conn_or_panic(api_config, &ctx); - update_predicate_status( - &predicate_spec.key(), - status, - &mut predicates_db_conn, - &ctx, - ) + predicates_db_conn, + ctx, + ); } } if block_heights_to_scan.is_empty() && floating_end_block { - match bitcoin_rpc.get_blockchain_info() { - Ok(result) => { - for entry in (current_block_height + 1)..result.blocks { - block_heights_to_scan.push_back(entry); + let new_tip = match bitcoin_rpc.get_blockchain_info() { + Ok(result) => match predicate_spec.end_block { + Some(end_block) => { + if end_block > result.blocks { + result.blocks + } else { + end_block + } } - } + None => result.blocks, + }, Err(_e) => { continue; } }; + + for entry in (current_block_height + 1)..new_tip { + block_heights_to_scan.push_back(entry); + } + number_of_blocks_to_scan += block_heights_to_scan.len() as u64; } } info!( @@ -168,18 +213,34 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( "{number_of_blocks_scanned} blocks scanned, {actions_triggered} actions triggered" ); - if let PredicatesApi::On(ref api_config) = config.http_api { - let status = PredicateStatus::Scanning(ScanningData { + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + if let Some(predicate_end_block) = predicate_spec.end_block { + if predicate_end_block == last_block_scanned.index { + // todo: we need to find a way to check if this block is confirmed + // and if so, set the status to confirmed expiration + set_unconfirmed_expiration_status( + &Chain::Bitcoin, + number_of_blocks_scanned, + predicate_end_block, + &predicate_spec.key(), + predicates_db_conn, + ctx, + ); + return Ok(true); + } + } + set_predicate_scanning_status( + &predicate_spec.key(), number_of_blocks_to_scan, number_of_blocks_scanned, - number_of_blocks_sent, - current_block_height: 0, - }); - let mut predicates_db_conn = open_readwrite_predicates_db_conn_or_panic(api_config, &ctx); - update_predicate_status(&predicate_spec.key(), status, &mut predicates_db_conn, &ctx) + number_of_times_triggered, + last_block_scanned.index, + predicates_db_conn, + ctx, + ); } - Ok(()) + return Ok(false); } pub async fn process_block_with_predicates( @@ -187,14 +248,14 @@ pub async fn process_block_with_predicates( predicates: &Vec<&BitcoinChainhookSpecification>, event_observer_config: &EventObserverConfig, ctx: &Context, -) -> Result { +) -> Result { let chain_event = BitcoinChainEvent::ChainUpdatedWithBlocks(BitcoinChainUpdatedWithBlocksData { new_blocks: vec![block], confirmed_blocks: vec![], }); - let (predicates_triggered, _predicates_evaluated) = + let (predicates_triggered, _predicates_evaluated, _predicates_expired) = evaluate_bitcoin_chainhooks_on_chain_event(&chain_event, predicates, ctx); execute_predicates_action(predicates_triggered, &event_observer_config, &ctx).await @@ -204,7 +265,7 @@ pub async fn execute_predicates_action<'a>( hits: Vec>, config: &EventObserverConfig, ctx: &Context, -) -> Result { +) -> Result { let mut actions_triggered = 0; let mut proofs = HashMap::new(); for trigger in hits.into_iter() { diff --git a/components/chainhook-cli/src/scan/stacks.rs b/components/chainhook-cli/src/scan/stacks.rs index ee1353e86..79dc6cff4 100644 --- a/components/chainhook-cli/src/scan/stacks.rs +++ b/components/chainhook-cli/src/scan/stacks.rs @@ -4,8 +4,8 @@ use crate::{ archive::download_stacks_dataset_if_required, config::{Config, PredicatesApi}, service::{ - open_readwrite_predicates_db_conn_or_panic, update_predicate_status, PredicateStatus, - ScanningData, + open_readwrite_predicates_db_conn_or_panic, set_confirmed_expiration_status, + set_predicate_scanning_status, set_unconfirmed_expiration_status, ScanningData, }, storage::{ get_last_block_height_inserted, get_last_unconfirmed_block_height_inserted, @@ -13,7 +13,7 @@ use crate::{ open_readwrite_stacks_db_conn, }, }; -use chainhook_sdk::types::BlockIdentifier; +use chainhook_sdk::types::{BlockIdentifier, Chain}; use chainhook_sdk::{ chainhooks::stacks::evaluate_stacks_chainhook_on_blocks, indexer::{self, stacks::standardize_stacks_serialized_block_header, Indexer}, @@ -36,7 +36,7 @@ pub enum DigestingCommand { Terminate, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct Record { pub id: u64, pub created_at: String, @@ -44,7 +44,7 @@ pub struct Record { pub blob: Option, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub enum RecordKind { #[serde(rename = "/new_block")] StacksBlockReceived, @@ -145,17 +145,21 @@ pub async fn get_canonical_fork_from_tsv( pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( predicate_spec: &StacksChainhookSpecification, + unfinished_scan_data: Option, stacks_db_conn: &DB, config: &Config, ctx: &Context, -) -> Result { +) -> Result<(BlockIdentifier, bool), String> { let mut floating_end_block = false; let mut block_heights_to_scan = if let Some(ref blocks) = predicate_spec.blocks { BlockHeights::Blocks(blocks.clone()).get_sorted_entries() } else { let start_block = match predicate_spec.start_block { - Some(start_block) => start_block, + Some(start_block) => match &unfinished_scan_data { + Some(scan_data) => scan_data.last_evaluated_block_height, + None => start_block, + }, None => { return Err( "Chainhook specification must include fields 'start_block' when using the scan command" @@ -165,7 +169,31 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( }; let (end_block, update_end_block) = match predicate_spec.end_block { - Some(end_block) => (end_block, false), + Some(end_block) => { + // if the user provided an end block that is above the chain tip, we'll + // only scan up to the chain tip, then go to streaming mode + match get_last_unconfirmed_block_height_inserted(stacks_db_conn, ctx) { + Some(chain_tip) => { + if end_block > chain_tip { + (chain_tip, true) + } else { + (end_block, false) + } + } + None => match get_last_block_height_inserted(stacks_db_conn, ctx) { + Some(chain_tip) => { + if end_block > chain_tip { + (chain_tip, true) + } else { + (end_block, false) + } + } + None => { + return Err("Chainhook specification must include fields 'end_block' when using the scan command".into()); + } + }, + } + } None => match get_last_unconfirmed_block_height_inserted(stacks_db_conn, ctx) { Some(end_block) => (end_block, true), None => match get_last_block_height_inserted(stacks_db_conn, ctx) { @@ -192,16 +220,24 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( }; let proofs = HashMap::new(); - let mut blocks_scanned = 0; info!( ctx.expect_logger(), "Starting predicate evaluation on Stacks blocks" ); let mut last_block_scanned = BlockIdentifier::default(); let mut err_count = 0; - let number_of_blocks_to_scan = block_heights_to_scan.len() as u64; - let mut number_of_blocks_scanned = 0; - let mut number_of_blocks_sent = 0u64; + + let (mut number_of_blocks_to_scan, mut number_of_blocks_scanned, mut number_of_times_triggered) = { + let number_of_blocks_to_scan = block_heights_to_scan.len() as u64; + match &unfinished_scan_data { + Some(scan_data) => ( + scan_data.number_of_blocks_to_scan, + scan_data.number_of_blocks_evaluated, + scan_data.number_of_times_triggered, + ), + None => (number_of_blocks_to_scan, 0, 0u64), + } + }; while let Some(current_block_height) = block_heights_to_scan.pop_front() { number_of_blocks_scanned += 1; @@ -231,11 +267,11 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( } }; last_block_scanned = block_data.block_identifier.clone(); - blocks_scanned += 1; let blocks: Vec<&dyn AbstractStacksBlock> = vec![&block_data]; - let hits_per_blocks = evaluate_stacks_chainhook_on_blocks(blocks, &predicate_spec, ctx); + let (hits_per_blocks, _predicates_expired) = + evaluate_stacks_chainhook_on_blocks(blocks, &predicate_spec, ctx); if hits_per_blocks.is_empty() { continue; } @@ -245,47 +281,82 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( apply: hits_per_blocks, rollback: vec![], }; - match handle_stacks_hook_action(trigger, &proofs, &ctx) { + let res = match handle_stacks_hook_action(trigger, &proofs, &ctx) { Err(e) => { error!(ctx.expect_logger(), "unable to handle action {}", e); + Ok(()) // todo: should this error increment our err_count? } Ok(action) => { - number_of_blocks_sent += 1; + number_of_times_triggered += 1; let res = match action { StacksChainhookOccurrence::Http(request) => { send_request(request, 3, 1, &ctx).await } StacksChainhookOccurrence::File(path, bytes) => file_append(path, bytes, &ctx), - StacksChainhookOccurrence::Data(_payload) => unreachable!(), + StacksChainhookOccurrence::Data(_payload) => Ok(()), }; - if res.is_err() { - err_count += 1; - } else { - err_count = 0; + match res { + Err(e) => { + err_count += 1; + Err(e) + } + Ok(_) => { + err_count = 0; + Ok(()) + } } } - } + }; // We abort after 3 consecutive errors if err_count >= 3 { - return Err(format!("Scan aborted (consecutive action errors >= 3)")); + if res.is_err() { + return Err(format!( + "Scan aborted (consecutive action errors >= 3): {}", + res.unwrap_err() + )); + } else { + return Err(format!("Scan aborted (consecutive action errors >= 3)")); + } } if let Some(ref mut predicates_db_conn) = predicates_db_conn { - if blocks_scanned % 5000 == 0 { - let status = PredicateStatus::Scanning(ScanningData { + if number_of_blocks_scanned % 10 == 0 || number_of_blocks_scanned == 1 { + set_predicate_scanning_status( + &predicate_spec.key(), number_of_blocks_to_scan, number_of_blocks_scanned, - number_of_blocks_sent, + number_of_times_triggered, current_block_height, - }); - update_predicate_status(&predicate_spec.key(), status, predicates_db_conn, &ctx) + predicates_db_conn, + ctx, + ); } } // Update end_block, in case a new block was discovered during the scan if block_heights_to_scan.is_empty() && floating_end_block { let new_tip = match predicate_spec.end_block { - Some(end_block) => end_block, + Some(end_block) => { + match get_last_unconfirmed_block_height_inserted(stacks_db_conn, ctx) { + Some(chain_tip) => { + if end_block > chain_tip { + chain_tip + } else { + end_block + } + } + None => match get_last_block_height_inserted(stacks_db_conn, ctx) { + Some(chain_tip) => { + if end_block > chain_tip { + chain_tip + } else { + end_block + } + } + None => current_block_height, + }, + } + } None => match get_last_unconfirmed_block_height_inserted(stacks_db_conn, ctx) { Some(end_block) => end_block, None => match get_last_block_height_inserted(stacks_db_conn, ctx) { @@ -297,23 +368,61 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( for entry in (current_block_height + 1)..=new_tip { block_heights_to_scan.push_back(entry); } + number_of_blocks_to_scan += block_heights_to_scan.len() as u64; } } info!( ctx.expect_logger(), - "{blocks_scanned} blocks scanned, {number_of_blocks_sent} blocks triggering predicate" + "{number_of_blocks_scanned} blocks scanned, {number_of_times_triggered} blocks triggering predicate" ); if let Some(ref mut predicates_db_conn) = predicates_db_conn { - let status = PredicateStatus::Scanning(ScanningData { + if let Some(predicate_end_block) = predicate_spec.end_block { + if predicate_end_block == last_block_scanned.index { + let is_confirmed = match get_stacks_block_at_block_height( + predicate_end_block, + true, + 3, + stacks_db_conn, + ) { + Ok(block) => match block { + Some(_) => true, + None => false, + }, + Err(e) => { + warn!( + ctx.expect_logger(), + "Failed to get stacks block for status update: {}", + e.to_string() + ); + false + } + }; + set_unconfirmed_expiration_status( + &Chain::Stacks, + number_of_blocks_scanned, + predicate_end_block, + &predicate_spec.key(), + predicates_db_conn, + ctx, + ); + if is_confirmed { + set_confirmed_expiration_status(&predicate_spec.key(), predicates_db_conn, ctx); + } + return Ok((last_block_scanned, true)); + } + } + set_predicate_scanning_status( + &predicate_spec.key(), number_of_blocks_to_scan, number_of_blocks_scanned, - number_of_blocks_sent, - current_block_height: 0, - }); - update_predicate_status(&predicate_spec.key(), status, predicates_db_conn, &ctx) + number_of_times_triggered, + last_block_scanned.index, + predicates_db_conn, + ctx, + ); } - Ok(last_block_scanned) + Ok((last_block_scanned, false)) } pub async fn scan_stacks_chainstate_via_csv_using_predicate( @@ -374,7 +483,8 @@ pub async fn scan_stacks_chainstate_via_csv_using_predicate( let blocks: Vec<&dyn AbstractStacksBlock> = vec![&block_data]; - let hits_per_blocks = evaluate_stacks_chainhook_on_blocks(blocks, &predicate_spec, ctx); + let (hits_per_blocks, _predicates_expired) = + evaluate_stacks_chainhook_on_blocks(blocks, &predicate_spec, ctx); if hits_per_blocks.is_empty() { continue; } diff --git a/components/chainhook-cli/src/service/http_api.rs b/components/chainhook-cli/src/service/http_api.rs index 2951be54d..55b583905 100644 --- a/components/chainhook-cli/src/service/http_api.rs +++ b/components/chainhook-cli/src/service/http_api.rs @@ -102,7 +102,7 @@ fn handle_get_predicates( let serialized_predicates = predicates .iter() - .map(|(p, _)| p.into_serialized_json()) + .map(|(p, s)| serialized_predicate_with_status(p, s)) .collect::>(); Json(json!({ @@ -194,36 +194,22 @@ fn handle_get_predicate( match open_readwrite_predicates_db_conn(api_config) { Ok(mut predicates_db_conn) => { - let entry = match get_entry_from_predicates_db( + let (predicate, status) = match get_entry_from_predicates_db( &ChainhookSpecification::either_stx_or_btc_key(&predicate_uuid), &mut predicates_db_conn, &ctx, ) { - Ok(Some((ChainhookSpecification::Stacks(spec), status))) => json!({ - "chain": "stacks", - "uuid": spec.uuid, - "network": spec.network, - "predicate": spec.predicate, - "status": status, - "enabled": spec.enabled, - }), - Ok(Some((ChainhookSpecification::Bitcoin(spec), status))) => json!({ - "chain": "bitcoin", - "uuid": spec.uuid, - "network": spec.network, - "predicate": spec.predicate, - "status": status, - "enabled": spec.enabled, - }), + Ok(Some(predicate_with_status)) => predicate_with_status, _ => { return Json(json!({ "status": 404, })) } }; + let result = serialized_predicate_with_status(&predicate, &status); Json(json!({ "status": 200, - "result": entry + "result": result })) } Err(e) => Json(json!({ @@ -387,3 +373,27 @@ pub fn get_routes_spec() -> (Vec, OpenApi) { handle_delete_stacks_predicate ] } + +fn serialized_predicate_with_status( + predicate: &ChainhookSpecification, + status: &PredicateStatus, +) -> JsonValue { + match (predicate, status) { + (ChainhookSpecification::Stacks(spec), status) => json!({ + "chain": "stacks", + "uuid": spec.uuid, + "network": spec.network, + "predicate": spec.predicate, + "status": status, + "enabled": spec.enabled, + }), + (ChainhookSpecification::Bitcoin(spec), status) => json!({ + "chain": "bitcoin", + "uuid": spec.uuid, + "network": spec.network, + "predicate": spec.predicate, + "status": status, + "enabled": spec.enabled, + }), + } +} diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index 2016c5179..e9b213e67 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -12,12 +12,18 @@ use crate::storage::{ use chainhook_sdk::chainhooks::types::{ChainhookConfig, ChainhookFullSpecification}; use chainhook_sdk::chainhooks::types::ChainhookSpecification; -use chainhook_sdk::observer::{start_event_observer, ObserverEvent}; -use chainhook_sdk::types::StacksChainEvent; +use chainhook_sdk::observer::{ + start_event_observer, HookExpirationData, ObserverCommand, ObserverEvent, + PredicateEvaluationReport, +}; +use chainhook_sdk::types::{Chain, StacksChainEvent}; use chainhook_sdk::utils::Context; use redis::{Commands, Connection}; use std::sync::mpsc::channel; +use std::time::{SystemTime, UNIX_EPOCH}; + +use self::http_api::get_entry_from_predicates_db; pub struct Service { config: Config, @@ -29,11 +35,17 @@ impl Service { Self { config, ctx } } - pub async fn run(&mut self, predicates: Vec) -> Result<(), String> { + pub async fn run( + &mut self, + predicates_from_startup: Vec, + ) -> Result<(), String> { let mut chainhook_config = ChainhookConfig::new(); - // If no predicates passed at launch, retrieve predicates from Redis - if predicates.is_empty() && self.config.is_http_api_enabled() { + // store all predicates from Redis that were in the process of scanning when + // chainhook was shutdown - we need to resume where we left off + let mut leftover_scans = vec![]; + // retrieve predicates from Redis, and register each in memory + if self.config.is_http_api_enabled() { let registered_predicates = match load_predicates_from_redis(&self.config, &self.ctx) { Ok(predicates) => predicates, Err(e) => { @@ -45,8 +57,29 @@ impl Service { vec![] } }; - for (predicate, _status) in registered_predicates.into_iter() { + for (predicate, status) in registered_predicates.into_iter() { let predicate_uuid = predicate.uuid().to_string(); + match status { + PredicateStatus::Scanning(scanning_data) => { + leftover_scans.push((predicate.clone(), Some(scanning_data))); + } + PredicateStatus::New => { + leftover_scans.push((predicate.clone(), None)); + } + // predicates that were previously in a streaming state probably + // need to catch up on blocks + PredicateStatus::Streaming(streaming_data) => { + let scanning_data = ScanningData { + number_of_blocks_to_scan: 0, // this is the only data we don't know when converting from streaming => scanning + number_of_blocks_evaluated: streaming_data.number_of_blocks_evaluated, + number_of_times_triggered: streaming_data.number_of_times_triggered, + last_occurrence: streaming_data.last_occurrence, + last_evaluated_block_height: streaming_data.last_evaluated_block_height, + }; + leftover_scans.push((predicate.clone(), Some(scanning_data))); + } + _ => {} + } match chainhook_config.register_specification(predicate) { Ok(_) => { info!( @@ -65,8 +98,28 @@ impl Service { } } + let mut newly_registered_predicates = vec![]; // For each predicate found, register in memory. - for predicate in predicates.into_iter() { + for predicate in predicates_from_startup.into_iter() { + if let PredicatesApi::On(api_config) = &self.config.http_api { + if let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn(api_config) { + let uuid = predicate.get_uuid(); + match get_entry_from_predicates_db( + &ChainhookSpecification::either_stx_or_btc_key(&uuid), + &mut predicates_db_conn, + &self.ctx, + ) { + Ok(Some(_)) => { + error!( + self.ctx.expect_logger(), + "Predicate uuid already in use: {uuid}", + ); + continue; + } + _ => {} + } + }; + } match chainhook_config.register_full_specification( ( &self.config.network.bitcoin_network, @@ -75,6 +128,7 @@ impl Service { predicate, ) { Ok(spec) => { + newly_registered_predicates.push(spec.clone()); info!( self.ctx.expect_logger(), "Predicate {} retrieved from config and loaded", @@ -137,7 +191,8 @@ impl Service { .expect("unable to spawn thread"); // Enable HTTP Predicates API, if required - if let PredicatesApi::On(ref api_config) = self.config.http_api { + let config = self.config.clone(); + if let PredicatesApi::On(ref api_config) = config.http_api { info!( self.ctx.expect_logger(), "Listening on port {} for chainhook predicate registrations", api_config.http_port @@ -152,16 +207,42 @@ impl Service { }); } + let observer_event_tx_moved = observer_event_tx.clone(); + let moved_observer_command_tx = observer_command_tx.clone(); let _ = start_event_observer( event_observer_config.clone(), - observer_command_tx, + moved_observer_command_tx, observer_command_rx, - Some(observer_event_tx), + Some(observer_event_tx_moved), None, self.ctx.clone(), ); let mut stacks_event = 0; + + let ctx = self.ctx.clone(); + let mut predicates_db_conn = match self.config.http_api { + PredicatesApi::On(ref api_config) => { + Some(open_readwrite_predicates_db_conn_or_panic(api_config, &ctx)) + } + PredicatesApi::Off => None, + }; + + for predicate_with_last_scanned_block in leftover_scans { + match predicate_with_last_scanned_block { + (ChainhookSpecification::Stacks(spec), last_scanned_block) => { + let _ = stacks_scan_op_tx.send((spec, last_scanned_block)); + } + (ChainhookSpecification::Bitcoin(spec), last_scanned_block) => { + let _ = bitcoin_scan_op_tx.send((spec, last_scanned_block)); + } + } + } + + for new_predicate in newly_registered_predicates { + let _ = observer_event_tx.send(ObserverEvent::PredicateRegistered(new_predicate)); + } + loop { let event = match observer_event_rx.recv() { Ok(cmd) => cmd, @@ -200,17 +281,17 @@ impl Service { ); update_predicate_status( &spec.key(), - PredicateStatus::Disabled, + PredicateStatus::New, &mut predicates_db_conn, &self.ctx, ); } match spec { ChainhookSpecification::Stacks(predicate_spec) => { - let _ = stacks_scan_op_tx.send(predicate_spec); + let _ = stacks_scan_op_tx.send((predicate_spec, None)); } ChainhookSpecification::Bitcoin(predicate_spec) => { - let _ = bitcoin_scan_op_tx.send(predicate_spec); + let _ = bitcoin_scan_op_tx.send((predicate_spec, None)); } } } @@ -234,11 +315,11 @@ impl Service { &mut predicates_db_conn, &self.ctx, ); - update_predicate_status( + set_predicate_streaming_status( + StreamingDataType::FinishedScanning, &spec.key(), - PredicateStatus::InitialScanCompleted, &mut predicates_db_conn, - &self.ctx, + &ctx, ); } } @@ -268,8 +349,69 @@ impl Service { } } } - ObserverEvent::BitcoinChainEvent((_chain_update, _report)) => { + ObserverEvent::BitcoinChainEvent((chain_update, report)) => { debug!(self.ctx.expect_logger(), "Bitcoin update not stored"); + match chain_update { + chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithBlocks(data) => { + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + for confirmed_block in &data.confirmed_blocks { + match expire_predicates_for_block( + &Chain::Bitcoin, + confirmed_block.block_identifier.index, + predicates_db_conn, + &ctx, + ) { + Some(expired_predicate_uuids) => { + for uuid in expired_predicate_uuids.into_iter() { + let _ = observer_command_tx.send( + ObserverCommand::ExpireBitcoinPredicate( + HookExpirationData { + hook_uuid: uuid, + block_height: confirmed_block + .block_identifier + .index, + }, + ), + ); + } + } + None => {} + } + } + } + } + chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithReorg(data) => { + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + for confirmed_block in &data.confirmed_blocks { + match expire_predicates_for_block( + &Chain::Bitcoin, + confirmed_block.block_identifier.index, + predicates_db_conn, + &ctx, + ) { + Some(expired_predicate_uuids) => { + for uuid in expired_predicate_uuids.into_iter() { + let _ = observer_command_tx.send( + ObserverCommand::ExpireBitcoinPredicate( + HookExpirationData { + hook_uuid: uuid, + block_height: confirmed_block + .block_identifier + .index, + }, + ), + ); + } + } + None => {} + } + } + } + } + } + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + update_stats_from_report(Chain::Bitcoin, report, predicates_db_conn, &ctx); + } } ObserverEvent::StacksChainEvent((chain_event, report)) => { let stacks_db_conn_rw = match open_readwrite_stacks_db_conn( @@ -289,6 +431,32 @@ impl Service { match &chain_event { StacksChainEvent::ChainUpdatedWithBlocks(data) => { stacks_event += 1; + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + for confirmed_block in &data.confirmed_blocks { + match expire_predicates_for_block( + &Chain::Stacks, + confirmed_block.block_identifier.index, + predicates_db_conn, + &ctx, + ) { + Some(expired_predicate_uuids) => { + for uuid in expired_predicate_uuids.into_iter() { + let _ = observer_command_tx.send( + ObserverCommand::ExpireStacksPredicate( + HookExpirationData { + hook_uuid: uuid, + block_height: confirmed_block + .block_identifier + .index, + }, + ), + ); + } + } + None => {} + } + } + } confirm_entries_in_stacks_blocks( &data.confirmed_blocks, &stacks_db_conn_rw, @@ -301,6 +469,32 @@ impl Service { ) } StacksChainEvent::ChainUpdatedWithReorg(data) => { + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + for confirmed_block in &data.confirmed_blocks { + match expire_predicates_for_block( + &Chain::Stacks, + confirmed_block.block_identifier.index, + predicates_db_conn, + &ctx, + ) { + Some(expired_predicate_uuids) => { + for uuid in expired_predicate_uuids.into_iter() { + let _ = observer_command_tx.send( + ObserverCommand::ExpireStacksPredicate( + HookExpirationData { + hook_uuid: uuid, + block_height: confirmed_block + .block_identifier + .index, + }, + ), + ); + } + } + None => {} + } + } + } confirm_entries_in_stacks_blocks( &data.confirmed_blocks, &stacks_db_conn_rw, @@ -315,10 +509,9 @@ impl Service { StacksChainEvent::ChainUpdatedWithMicroblocks(_) | StacksChainEvent::ChainUpdatedWithMicroblocksReorg(_) => {} }; - - for (_predicate_uuid, _blocks_ids) in report.predicates_evaluated.iter() {} - - for (_predicate_uuid, _blocks_ids) in report.predicates_triggered.iter() {} + if let Some(ref mut predicates_db_conn) = predicates_db_conn { + update_stats_from_report(Chain::Stacks, report, predicates_db_conn, &ctx); + } // Every 32 blocks, we will check if there's a new Stacks file archive to ingest if stacks_event > 32 { stacks_event = 0; @@ -342,26 +535,483 @@ impl Service { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] +/// A high-level view of how `PredicateStatus` is used/updated can be seen here: docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png. pub enum PredicateStatus { Scanning(ScanningData), Streaming(StreamingData), - InitialScanCompleted, + UnconfirmedExpiration(ExpiredData), + ConfirmedExpiration(ExpiredData), Interrupted(String), - Disabled, + New, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct ScanningData { pub number_of_blocks_to_scan: u64, - pub number_of_blocks_scanned: u64, - pub number_of_blocks_sent: u64, - pub current_block_height: u64, + pub number_of_blocks_evaluated: u64, + pub number_of_times_triggered: u64, + pub last_occurrence: u128, + pub last_evaluated_block_height: u64, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct StreamingData { - pub last_occurence: u64, - pub last_evaluation: u64, + pub last_occurrence: u128, + pub last_evaluation: u128, + pub number_of_times_triggered: u64, + pub number_of_blocks_evaluated: u64, + pub last_evaluated_block_height: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExpiredData { + pub number_of_blocks_evaluated: u64, + pub number_of_times_triggered: u64, + pub last_occurrence: u128, + pub last_evaluated_block_height: u64, + pub expired_at_block_height: u64, +} + +fn update_stats_from_report( + chain: Chain, + report: PredicateEvaluationReport, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + for (predicate_uuid, blocks_ids) in report.predicates_triggered.iter() { + if let Some(last_triggered_height) = blocks_ids.last().and_then(|b| Some(b.index)) { + let triggered_count = blocks_ids.len().try_into().unwrap(); + set_predicate_streaming_status( + StreamingDataType::Occurrence { + last_triggered_height, + triggered_count, + }, + &(ChainhookSpecification::either_stx_or_btc_key(predicate_uuid)), + predicates_db_conn, + &ctx, + ); + } + } + + for (predicate_uuid, blocks_ids) in report.predicates_evaluated.iter() { + // clone so we don't actually update the report + let mut blocks_ids = blocks_ids.clone(); + // any triggered or expired predicate was also evaluated. But we already updated the status for that block, + // so remove those matching blocks from the list of evaluated predicates + if let Some(triggered_block_ids) = report.predicates_triggered.get(predicate_uuid) { + for triggered_id in triggered_block_ids { + blocks_ids.remove(triggered_id); + } + } + if let Some(expired_block_ids) = report.predicates_expired.get(predicate_uuid) { + for expired_id in expired_block_ids { + blocks_ids.remove(expired_id); + } + } + if let Some(last_evaluated_height) = blocks_ids.last().and_then(|b| Some(b.index)) { + let evaluated_count = blocks_ids.len().try_into().unwrap(); + set_predicate_streaming_status( + StreamingDataType::Evaluation { + last_evaluated_height, + evaluated_count, + }, + &(ChainhookSpecification::either_stx_or_btc_key(predicate_uuid)), + predicates_db_conn, + &ctx, + ); + } + } + for (predicate_uuid, blocks_ids) in report.predicates_expired.iter() { + if let Some(last_evaluated_height) = blocks_ids.last().and_then(|b| Some(b.index)) { + let evaluated_count = blocks_ids.len().try_into().unwrap(); + set_unconfirmed_expiration_status( + &chain, + evaluated_count, + last_evaluated_height, + &(ChainhookSpecification::either_stx_or_btc_key(predicate_uuid)), + predicates_db_conn, + &ctx, + ); + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum StreamingDataType { + Occurrence { + last_triggered_height: u64, + triggered_count: u64, + }, + Evaluation { + last_evaluated_height: u64, + evaluated_count: u64, + }, + FinishedScanning, +} + +/// Updates a predicate's status to `Streaming` if `Scanning` is complete. +/// +/// If `StreamingStatusType` is `Occurrence`, sets the `last_occurrence` & `last_evaluation` fields to the current time. +/// +/// If `StreamingStatusType` is `Evaluation`, sets the `last_evaluation` field to the current time while leaving the `last_occurrence` field as it was. +fn set_predicate_streaming_status( + streaming_data_type: StreamingDataType, + predicate_key: &str, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + let now_ms = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Could not get current time in ms") + .as_millis(); + let ( + last_occurrence, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + ) = { + let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); + match current_status { + Some(status) => match status { + PredicateStatus::Streaming(StreamingData { + last_occurrence, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + last_evaluation: _, + }) => ( + last_occurrence, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + ), + PredicateStatus::Scanning(ScanningData { + number_of_blocks_to_scan: _, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + last_occurrence, + }) => ( + last_occurrence, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + ), + PredicateStatus::UnconfirmedExpiration(ExpiredData { + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height, + expired_at_block_height: _, + }) => ( + last_occurrence, + number_of_blocks_evaluated, + number_of_times_triggered, + last_evaluated_block_height, + ), + PredicateStatus::New + | PredicateStatus::Interrupted(_) + | PredicateStatus::ConfirmedExpiration(_) => { + unreachable!("unreachable predicate status: {:?}", status) + } + }, + None => (0, 0, 0, 0), + } + }; + let ( + last_occurrence, + number_of_times_triggered, + number_of_blocks_evaluated, + last_evaluated_block_height, + ) = match streaming_data_type { + StreamingDataType::Occurrence { + last_triggered_height, + triggered_count, + } => ( + now_ms, + number_of_times_triggered + triggered_count, + number_of_blocks_evaluated + triggered_count, + last_triggered_height, + ), + StreamingDataType::Evaluation { + last_evaluated_height, + evaluated_count, + } => ( + last_occurrence, + number_of_times_triggered, + number_of_blocks_evaluated + evaluated_count, + last_evaluated_height, + ), + StreamingDataType::FinishedScanning => ( + last_occurrence, + number_of_times_triggered, + number_of_blocks_evaluated, + last_evaluated_block_height, + ), + }; + + update_predicate_status( + predicate_key, + PredicateStatus::Streaming(StreamingData { + last_occurrence, + last_evaluation: now_ms, + number_of_times_triggered, + last_evaluated_block_height, + number_of_blocks_evaluated, + }), + predicates_db_conn, + &ctx, + ); +} + +/// Updates a predicate's status to `Scanning`. +/// +/// Sets the `last_occurrence` time to the current time if a new trigger has occurred since the last status update. +pub fn set_predicate_scanning_status( + predicate_key: &str, + number_of_blocks_to_scan: u64, + number_of_blocks_evaluated: u64, + number_of_times_triggered: u64, + current_block_height: u64, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + let now_ms = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Could not get current time in ms") + .as_millis(); + let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); + let last_occurrence = match current_status { + Some(status) => match status { + PredicateStatus::Scanning(scanning_data) => { + if number_of_times_triggered > scanning_data.number_of_times_triggered { + now_ms + } else { + scanning_data.last_occurrence + } + } + PredicateStatus::Streaming(streaming_data) => { + if number_of_times_triggered > streaming_data.number_of_times_triggered { + now_ms + } else { + streaming_data.last_occurrence + } + } + PredicateStatus::UnconfirmedExpiration(expired_data) => { + if number_of_times_triggered > expired_data.number_of_times_triggered { + now_ms + } else { + expired_data.last_occurrence + } + } + PredicateStatus::New => { + if number_of_times_triggered > 0 { + now_ms + } else { + 0 + } + } + PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { + unreachable!("unreachable predicate status: {:?}", status) + } + }, + None => 0, + }; + + update_predicate_status( + predicate_key, + PredicateStatus::Scanning(ScanningData { + number_of_blocks_to_scan, + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height: current_block_height, + }), + predicates_db_conn, + &ctx, + ); +} + +/// Updates a predicate's status to `InitialScanCompleted`. +/// +/// Preserves the scanning metrics from the predicate's previous status +pub fn set_unconfirmed_expiration_status( + chain: &Chain, + number_of_new_blocks_evaluated: u64, + last_evaluated_block_height: u64, + predicate_key: &str, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); + let ( + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + expired_at_block_height, + ) = match current_status { + Some(status) => match status { + PredicateStatus::Scanning(ScanningData { + number_of_blocks_to_scan: _, + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height, + }) => ( + number_of_blocks_evaluated + number_of_new_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height, + ), + PredicateStatus::New => (0, 0, 0, 0), + PredicateStatus::Streaming(StreamingData { + last_occurrence, + last_evaluation: _, + number_of_times_triggered, + number_of_blocks_evaluated, + last_evaluated_block_height, + }) => ( + number_of_blocks_evaluated + number_of_new_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height, + ), + PredicateStatus::UnconfirmedExpiration(ExpiredData { + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height: _, + expired_at_block_height, + }) => ( + number_of_blocks_evaluated + number_of_new_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + expired_at_block_height, + ), + PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { + unreachable!("unreachable predicate status: {:?}", status) + } + }, + None => (0, 0, 0, 0), + }; + update_predicate_status( + predicate_key, + PredicateStatus::UnconfirmedExpiration(ExpiredData { + number_of_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + last_evaluated_block_height, + expired_at_block_height, + }), + predicates_db_conn, + &ctx, + ); + insert_predicate_expiration( + chain, + expired_at_block_height, + predicate_key, + predicates_db_conn, + &ctx, + ); +} + +pub fn set_confirmed_expiration_status( + predicate_key: &str, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); + let expired_data = match current_status { + Some(status) => match status { + PredicateStatus::UnconfirmedExpiration(expired_data) => expired_data, + _ => unreachable!("unreachable predicate status: {:?}", status), + }, + None => unreachable!(), + }; + update_predicate_status( + predicate_key, + PredicateStatus::ConfirmedExpiration(expired_data), + predicates_db_conn, + &ctx, + ); +} + +fn get_predicate_expiration_key(chain: &Chain, block_height: u64) -> String { + match chain { + Chain::Bitcoin => format!("expires_at:bitcoin_block:{}", block_height), + Chain::Stacks => format!("expires_at:stacks_block:{}", block_height), + } +} +fn expire_predicates_for_block( + chain: &Chain, + confirmed_block_index: u64, + predicates_db_conn: &mut Connection, + ctx: &Context, +) -> Option> { + match get_predicates_expiring_at_block(chain, confirmed_block_index, predicates_db_conn, ctx) { + Some(predicates_to_expire) => { + for predicate_key in predicates_to_expire.iter() { + set_confirmed_expiration_status(predicate_key, predicates_db_conn, ctx); + } + Some(predicates_to_expire) + } + None => None, + } +} + +fn insert_predicate_expiration( + chain: &Chain, + expired_at_block_height: u64, + predicate_key: &str, + predicates_db_conn: &mut Connection, + ctx: &Context, +) { + let key = get_predicate_expiration_key(chain, expired_at_block_height); + let mut predicates_expiring_at_block = + get_predicates_expiring_at_block(chain, expired_at_block_height, predicates_db_conn, &ctx) + .unwrap_or(vec![]); + predicates_expiring_at_block.push(predicate_key.to_owned()); + let serialized_expiring_predicates = json!(predicates_expiring_at_block).to_string(); + if let Err(e) = + predicates_db_conn.hset::<_, _, _, ()>(&key, "predicates", &serialized_expiring_predicates) + { + error!( + ctx.expect_logger(), + "Error updating expired predicates index: {}", + e.to_string() + ); + } else { + info!( + ctx.expect_logger(), + "Updating expired predicates at block height {expired_at_block_height} with predicate: {predicate_key}" + ); + } +} + +fn get_predicates_expiring_at_block( + chain: &Chain, + block_index: u64, + predicates_db_conn: &mut Connection, + ctx: &Context, +) -> Option> { + let key = get_predicate_expiration_key(chain, block_index); + match predicates_db_conn.hget::<_, _, String>(key.to_string(), "predicates") { + Ok(ref payload) => match serde_json::from_str(payload) { + Ok(data) => { + if let Err(e) = predicates_db_conn.hdel::<_, _, u64>(key.to_string(), "predicates") + { + error!( + ctx.expect_logger(), + "Error removing expired predicates index: {}", + e.to_string() + ); + } + Some(data) + } + Err(_) => None, + }, + Err(_) => None, + } } pub fn update_predicate_status( @@ -387,7 +1037,7 @@ pub fn update_predicate_status( } } -pub fn update_predicate_spec( +fn update_predicate_spec( predicate_key: &str, spec: &ChainhookSpecification, predicates_db_conn: &mut Connection, @@ -410,7 +1060,7 @@ pub fn update_predicate_spec( } } -pub fn retrieve_predicate_status( +fn retrieve_predicate_status( predicate_key: &str, predicates_db_conn: &mut Connection, ) -> Option { diff --git a/components/chainhook-cli/src/service/runloops.rs b/components/chainhook-cli/src/service/runloops.rs index 0d1882dae..caa6c6f1b 100644 --- a/components/chainhook-cli/src/service/runloops.rs +++ b/components/chainhook-cli/src/service/runloops.rs @@ -21,14 +21,19 @@ use crate::{ storage::open_readonly_stacks_db_conn, }; +use super::ScanningData; + pub fn start_stacks_scan_runloop( config: &Config, - stacks_scan_op_rx: crossbeam_channel::Receiver, + stacks_scan_op_rx: crossbeam_channel::Receiver<( + StacksChainhookSpecification, + Option, + )>, observer_command_tx: Sender, ctx: &Context, ) { let stacks_scan_pool = ThreadPool::new(config.limits.max_number_of_concurrent_stacks_scans); - while let Ok(predicate_spec) = stacks_scan_op_rx.recv() { + while let Ok((predicate_spec, unfinished_scan_data)) = stacks_scan_op_rx.recv() { let moved_ctx = ctx.clone(); let moved_config = config.clone(); let observer_command_tx = observer_command_tx.clone(); @@ -49,12 +54,13 @@ pub fn start_stacks_scan_runloop( let op = scan_stacks_chainstate_via_rocksdb_using_predicate( &predicate_spec, + unfinished_scan_data, &stacks_db_conn, &moved_config, &moved_ctx, ); let res = hiro_system_kit::nestable_block_on(op); - let last_block_scanned = match res { + let (last_block_scanned, predicate_is_expired) = match res { Ok(last_block_scanned) => last_block_scanned, Err(e) => { warn!( @@ -84,9 +90,11 @@ pub fn start_stacks_scan_runloop( moved_ctx.expect_logger(), "Stacks chainstate scan completed up to block: {}", last_block_scanned.index ); - let _ = observer_command_tx.send(ObserverCommand::EnablePredicate( - ChainhookSpecification::Stacks(predicate_spec), - )); + if !predicate_is_expired { + let _ = observer_command_tx.send(ObserverCommand::EnablePredicate( + ChainhookSpecification::Stacks(predicate_spec), + )); + } }); } let res = stacks_scan_pool.join(); @@ -95,25 +103,29 @@ pub fn start_stacks_scan_runloop( pub fn start_bitcoin_scan_runloop( config: &Config, - bitcoin_scan_op_rx: crossbeam_channel::Receiver, + bitcoin_scan_op_rx: crossbeam_channel::Receiver<( + BitcoinChainhookSpecification, + Option, + )>, observer_command_tx: Sender, ctx: &Context, ) { let bitcoin_scan_pool = ThreadPool::new(config.limits.max_number_of_concurrent_bitcoin_scans); - while let Ok(predicate_spec) = bitcoin_scan_op_rx.recv() { + while let Ok((predicate_spec, unfinished_scan_data)) = bitcoin_scan_op_rx.recv() { let moved_ctx = ctx.clone(); let moved_config = config.clone(); let observer_command_tx = observer_command_tx.clone(); bitcoin_scan_pool.execute(move || { let op = scan_bitcoin_chainstate_via_rpc_using_predicate( &predicate_spec, + unfinished_scan_data, &moved_config, &moved_ctx, ); - match hiro_system_kit::nestable_block_on(op) { - Ok(_) => {} + let predicate_is_expired = match hiro_system_kit::nestable_block_on(op) { + Ok(predicate_is_expired) => predicate_is_expired, Err(e) => { error!( moved_ctx.expect_logger(), @@ -137,9 +149,11 @@ pub fn start_bitcoin_scan_runloop( return; } }; - let _ = observer_command_tx.send(ObserverCommand::EnablePredicate( - ChainhookSpecification::Bitcoin(predicate_spec), - )); + if !predicate_is_expired { + let _ = observer_command_tx.send(ObserverCommand::EnablePredicate( + ChainhookSpecification::Bitcoin(predicate_spec), + )); + } }); } let _ = bitcoin_scan_pool.join(); diff --git a/components/chainhook-cli/src/service/tests/helpers.rs b/components/chainhook-cli/src/service/tests/helpers.rs new file mode 100644 index 000000000..d42b34788 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers.rs @@ -0,0 +1,70 @@ +use crate::scan::stacks::Record; +use crate::scan::stacks::RecordKind; +use chainhook_sdk::indexer::stacks::NewBlock; +use chainhook_sdk::indexer::stacks::NewTransaction; + +fn create_stacks_tsv_transaction(index: u64) -> NewTransaction { + NewTransaction { + txid: format!("transaction_id_{index}"), + tx_index: index as usize, + status: format!("success"), + raw_result: format!("0x0703"), + raw_tx: format!("0x00000000010400e2cd0871da5bdd38c4d5569493dc3b14aac4e0a10000000000000019000000000000000000008373b16e4a6f9d87864c314dd77bbd8b27a2b1805e96ec5a6509e7e4f833cd6a7bdb2462c95f6968a867ab6b0e8f0a6498e600dbc46cfe9f84c79709da7b9637010200000000040000000000000000000000000000000000000000000000000000000000000000"), + execution_cost: None, + } +} + +pub fn create_stacks_tsv_block(height: u64, burn_block_height: u64) -> NewBlock { + let parent_height = if height == 0 { 0 } else { height - 1 }; + let parent_burn_block_height = if burn_block_height == 0 { + 0 + } else { + burn_block_height - 1 + }; + + NewBlock { + block_height: height, + block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{height}"), + index_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{height}"), + burn_block_height: burn_block_height, + burn_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{burn_block_height}"), + parent_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_height}"), + parent_index_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_height}"), + parent_microblock: "0x0000000000000000000000000000000000000000000000000000000000000000" + .into(), + parent_microblock_sequence: 0, + parent_burn_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_burn_block_height}"), + parent_burn_block_height: burn_block_height, + parent_burn_block_timestamp: 0, + transactions: (0..4).map(|i| create_stacks_tsv_transaction(i)).collect(), + events: vec![], + matured_miner_rewards: vec![], + } +} + +fn create_stacks_tsv_block_received_record(height: u64, burn_block_height: u64) -> Record { + let block = create_stacks_tsv_block(height, burn_block_height); + let serialized_block = serde_json::to_string(&block).unwrap(); + Record { + id: height, + created_at: height.to_string(), + kind: RecordKind::StacksBlockReceived, + blob: Some(serialized_block), + } +} +pub const WORKING_DIR: &str = "src/service/tests/fixtures/tmp"; +pub fn create_stacks_tsv_with_blocks(block_count: u64, dir: &str) { + let mut writer = csv::WriterBuilder::default() + .has_headers(false) + .delimiter(b'\t') + .double_quote(false) + .quote(b'\'') + .buffer_capacity(8 * (1 << 10)) + .from_path(dir) + .expect("unable to create csv writer"); + for i in 1..block_count + 1 { + writer + .serialize(create_stacks_tsv_block_received_record(i, i + 100)) + .unwrap(); + } +} diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index a8d9cfcb4..a142ce304 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -1,18 +1,42 @@ +use chainhook_sdk::indexer::stacks::NewBlock; +use chainhook_sdk::indexer::IndexerConfig; +use chainhook_sdk::types::BitcoinBlockSignaling; +use chainhook_sdk::types::BitcoinNetwork; +use chainhook_sdk::types::Chain; +use chainhook_sdk::types::StacksNetwork; +use chainhook_sdk::types::StacksNodeConfig; +use redis::Commands; use rocket::serde::json::Value as JsonValue; use rocket::Shutdown; use std::net::TcpListener; +use std::path::PathBuf; use std::sync::mpsc::Receiver; +use std::thread::sleep; +use std::time::Duration; use test_case::test_case; use chainhook_sdk::observer::ObserverCommand; +use crate::config::Config; +use crate::config::EventSourceConfig; +use crate::config::LimitsConfig; +use crate::config::PathConfig; +use crate::config::PredicatesApi; use crate::config::PredicatesApiConfig; +use crate::config::StorageConfig; use crate::config::DEFAULT_REDIS_URI; +use crate::scan::stacks::consolidate_local_stacks_chainstate_using_csv; +use crate::service::PredicateStatus; +use crate::service::Service; + +use self::helpers::{create_stacks_tsv_block, create_stacks_tsv_with_blocks, WORKING_DIR}; use super::channel; use super::http_api::start_predicate_api_server; use super::Context; +mod helpers; + const UUID: &str = "4ecc-4ecc-435b-9948-d5eeca1c3ce6"; fn build_bitcoin_payload( @@ -20,6 +44,7 @@ fn build_bitcoin_payload( if_this: Option, then_that: Option, filter: Option, + uuid: Option<&str>, ) -> JsonValue { let network = network.unwrap_or("mainnet"); let if_this = if_this.unwrap_or(json!({"scope":"block"})); @@ -36,7 +61,7 @@ fn build_bitcoin_payload( } json!({ "chain": "bitcoin", - "uuid": UUID, + "uuid": uuid.unwrap_or(UUID), "name": "test", "version": 1, "networks": { @@ -50,6 +75,7 @@ fn build_stacks_payload( if_this: Option, then_that: Option, filter: Option, + uuid: Option<&str>, ) -> JsonValue { let network = network.unwrap_or("mainnet"); let if_this = if_this.unwrap_or(json!({"scope":"txid", "equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"})); @@ -66,7 +92,7 @@ fn build_stacks_payload( } json!({ "chain": "stacks", - "uuid": UUID, + "uuid": uuid.unwrap_or(UUID), "name": "test", "version": 1, "networks": { @@ -131,7 +157,30 @@ async fn call_register_predicate(predicate: &JsonValue, port: u16) -> Result Result { + let client = reqwest::Client::new(); + let res =client + .get(format!("http://localhost:{port}/v1/chainhooks/{predicate_uuid}")) + .send() + .await + .map_err(|e| { + format!( + "Failed to make POST request to localhost:8765/v1/chainhooks: {}", + e + ) + })? + .json::() + .await + .map_err(|e| { + format!( + "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks: {}", e ) })?; @@ -201,7 +250,7 @@ async fn test_register_predicate(predicate: JsonValue) -> Result<(), (String, Sh #[test_case("regtest" ; "regtest")] #[tokio::test] async fn it_handles_bitcoin_predicates_with_network(network: &str) { - let predicate = build_bitcoin_payload(Some(network), None, None, None); + let predicate = build_bitcoin_payload(Some(network), None, None, None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -232,7 +281,7 @@ async fn it_handles_bitcoin_predicates_with_network(network: &str) { #[test_case(json!({"scope": "ordinals_protocol","operation": "inscription_feed"}) ; "with scope ordinals_protocol operation inscription_feed")] #[tokio::test] async fn it_handles_bitcoin_if_this_predicates(if_this: JsonValue) { - let predicate = build_bitcoin_payload(None, Some(if_this), None, None); + let predicate = build_bitcoin_payload(None, Some(if_this), None, None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -247,7 +296,7 @@ async fn it_handles_bitcoin_if_this_predicates(if_this: JsonValue) { #[test_case(json!({"file_append": {"path": "./path"}}) ; "with file_append action")] #[tokio::test] async fn it_handles_bitcoin_then_that_predicates(then_that: JsonValue) { - let predicate = build_bitcoin_payload(None, None, Some(then_that), None); + let predicate = build_bitcoin_payload(None, None, Some(then_that), None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -268,7 +317,7 @@ async fn it_handles_bitcoin_then_that_predicates(then_that: JsonValue) { #[test_case(json!({"include_witness": true}) ; "include_witness filter")] #[tokio::test] async fn it_handles_bitcoin_predicates_with_filters(filters: JsonValue) { - let predicate = build_bitcoin_payload(None, None, None, Some(filters)); + let predicate = build_bitcoin_payload(None, None, None, Some(filters), None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -284,7 +333,7 @@ async fn it_handles_bitcoin_predicates_with_filters(filters: JsonValue) { #[test_case("simnet" ; "simnet")] #[tokio::test] async fn it_handles_stacks_predicates_with_network(network: &str) { - let predicate = build_stacks_payload(Some(network), None, None, None); + let predicate = build_stacks_payload(Some(network), None, None, None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -315,7 +364,7 @@ async fn it_handles_stacks_predicates_with_network(network: &str) { #[test_case(json!({"scope":"txid","equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"}); "with scope txid")] #[tokio::test] async fn it_handles_stacks_if_this_predicates(if_this: JsonValue) { - let predicate = build_stacks_payload(None, Some(if_this), None, None); + let predicate = build_stacks_payload(None, Some(if_this), None, None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -330,7 +379,7 @@ async fn it_handles_stacks_if_this_predicates(if_this: JsonValue) { #[test_case(json!({"file_append": {"path": "./path"}}) ; "with file_append action")] #[tokio::test] async fn it_handles_stacks_then_that_predicates(then_that: JsonValue) { - let predicate = build_stacks_payload(None, None, Some(then_that), None); + let predicate = build_stacks_payload(None, None, Some(then_that), None, None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -349,7 +398,7 @@ async fn it_handles_stacks_then_that_predicates(then_that: JsonValue) { #[test_case(json!({"decode_clarity_values": true}) ; "decode_clarity_values filter")] #[tokio::test] async fn it_handles_stacks_predicates_with_filters(filters: JsonValue) { - let predicate = build_stacks_payload(None, None, None, Some(filters)); + let predicate = build_stacks_payload(None, None, None, Some(filters), None); match test_register_predicate(predicate).await { Ok(_) => {} Err((e, shutdown)) => { @@ -358,3 +407,241 @@ async fn it_handles_stacks_predicates_with_filters(filters: JsonValue) { } } } +fn flush_redis() { + let client = + redis::Client::open("redis://localhost:6378/").expect("unable to connect to redis"); + let mut predicate_db_conn = client.get_connection().expect("unable to connect to redis"); + let predicate_keys: Vec = predicate_db_conn + .scan_match("predicate:*") + .unwrap() + .into_iter() + .collect(); + for k in predicate_keys { + predicate_db_conn + .hdel::<_, _, ()>(&k, "predicates") + .unwrap(); + predicate_db_conn.hdel::<_, _, ()>(&k, "status").unwrap(); + predicate_db_conn + .hdel::<_, _, ()>(&k, "specification") + .unwrap(); + } +} +async fn start_chainhook_service( + chainhook_port: u16, + stacks_rpc_port: u16, + stacks_ingestion_port: u16, + working_dir: &str, + tsv_dir: &str, +) { + flush_redis(); + let logger = hiro_system_kit::log::setup_logger(); + let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); + let ctx = Context { + logger: Some(logger), + tracer: false, + }; + let api_config = PredicatesApiConfig { + http_port: chainhook_port, + display_logs: true, + database_uri: "redis://localhost:6378/".to_string(), + }; + let mut config = Config { + http_api: PredicatesApi::On(api_config), + storage: StorageConfig { + working_dir: working_dir.into(), + }, + event_sources: vec![EventSourceConfig::StacksTsvPath(PathConfig { + file_path: PathBuf::from(tsv_dir), + })], + limits: LimitsConfig { + max_number_of_bitcoin_predicates: 100, + max_number_of_concurrent_bitcoin_scans: 100, + max_number_of_stacks_predicates: 10, + max_number_of_concurrent_stacks_scans: 10, + max_number_of_processing_threads: 16, + max_number_of_networking_threads: 16, + max_caching_memory_size_mb: 32000, + }, + network: IndexerConfig { + bitcoin_network: BitcoinNetwork::Regtest, + stacks_network: StacksNetwork::Devnet, + bitcoind_rpc_username: "user".into(), + bitcoind_rpc_password: "user".into(), + bitcoind_rpc_url: "http://localhost:18443".into(), + bitcoin_block_signaling: BitcoinBlockSignaling::Stacks(StacksNodeConfig { + rpc_url: format!("http://localhost:{stacks_rpc_port}"), + ingestion_port: stacks_ingestion_port, + }), + }, + }; + // delete current database + consolidate_local_stacks_chainstate_using_csv(&mut config, &ctx) + .await + .unwrap(); + let mut service = Service::new(config, ctx); + let startup_predicates = vec![]; + let _ = hiro_system_kit::thread_named("Stacks service") + .spawn(move || { + let future = service.run(startup_predicates); + let _ = hiro_system_kit::nestable_block_on(future); + }) + .expect("unable to spawn thread"); + + // Loop to check if the server is ready + let mut attempts = 0; + const MAX_ATTEMPTS: u32 = 10; + loop { + if attempts >= MAX_ATTEMPTS { + panic!("failed to start server"); + } + + if let Ok(_client) = reqwest::Client::new() + .get(format!("http://localhost:{}/ping", chainhook_port)) + .send() + .await + { + break; // Server is ready + } + + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + attempts += 1; + } +} + +fn get_random_uuid() -> String { + let mut rng = rand::thread_rng(); + let random_digit: u64 = rand::Rng::gen(&mut rng); + format!("test-uuid-{random_digit}") +} + +fn get_random_dirs() -> (String, String) { + let mut rng = rand::thread_rng(); + let random_digit: u64 = rand::Rng::gen(&mut rng); + let working_dir = format!("{WORKING_DIR}/{random_digit}"); + let tsv_dir = format!("./{working_dir}/stacks_blocks.tsv"); + std::fs::create_dir_all(&working_dir).unwrap(); + (working_dir, tsv_dir) +} + +async fn get_predicate_status(uuid: &str, port: u16) -> PredicateStatus { + let res = call_get_predicate(uuid, port).await.unwrap(); + let res = res.as_object().unwrap(); + let res = res.get("result").unwrap(); + let status: PredicateStatus = + serde_json::from_value(res.get("status").unwrap().clone()).unwrap(); + status +} + +fn get_free_port() -> u16 { + let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to port 0"); + let port = listener.local_addr().unwrap().port(); + drop(listener); + port +} + +fn assert_confirmed_expiration_status(status: PredicateStatus) { + match status { + PredicateStatus::ConfirmedExpiration(_) => {} + _ => panic!("expected ConfirmedExpiration status, found {:?}", status), + } +} +fn assert_unconfirmed_expiration_status(status: PredicateStatus) { + match status { + PredicateStatus::UnconfirmedExpiration(_) => {} + _ => panic!("expected UnconfirmedExpiration status, found {:?}", status), + } +} + +fn assert_streaming_status(status: PredicateStatus) { + match status { + PredicateStatus::Streaming(_) => {} + _ => panic!("expected Streaming status, found {:?}", status), + } +} + +async fn mine_stacks_block(port: u16, height: u64, burn_block_height: u64) { + let block = create_stacks_tsv_block(height, burn_block_height); + let serialized_block = serde_json::to_string(&block).unwrap(); + let _block_again: NewBlock = serde_json::from_str(&serialized_block).unwrap(); + let client = reqwest::Client::new(); + let _res = client + .post(format!("http://localhost:{port}/new_block")) + .header("content-type", "application/json") + .body(serialized_block) + .send() + .await + .unwrap() + .text() + .await + .unwrap(); +} + +#[test_case(Chain::Stacks, 5, 0, Some(3) => ignore using assert_confirmed_expiration_status; "scanning to predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status for Stacks chain")] +#[test_case(Chain::Stacks, 5, 0, None => ignore using assert_streaming_status; "scanning with no predicate_end_block ends with Streaming status for Stacks chain")] +#[test_case(Chain::Stacks, 3, 0, Some(5) => ignore using assert_streaming_status; "scanning to predicate_end_block greater than chain_tip ends with Streaming status for Stacks chain")] +#[test_case(Chain::Stacks, 5, 3, Some(7) => ignore using assert_unconfirmed_expiration_status; "scanning with predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status for Stacks chain")] +#[test_case(Chain::Bitcoin, 5, 0, Some(3) => ignore using assert_confirmed_expiration_status; "scanning to predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status for Bitcoin chain")] +#[tokio::test] +//#[serial_test::serial] +async fn predicate_status_is_updated( + chain: Chain, + starting_chain_tip: u64, + blocks_to_mine: u64, + predicate_end_block: Option, +) -> PredicateStatus { + let chainhook_service_port = get_free_port(); + let stacks_rpc_port = get_free_port(); + let stacks_ingestion_port = get_free_port(); + let (working_dir, tsv_dir) = get_random_dirs(); + let uuid = &get_random_uuid(); + let predicate = match chain { + Chain::Stacks => { + create_stacks_tsv_with_blocks(starting_chain_tip, &tsv_dir); + build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": 1, "end_block": predicate_end_block})), + Some(uuid), + ) + } + Chain::Bitcoin => build_bitcoin_payload( + Some("regtest"), + Some(json!({"scope":"block"})), + None, + Some(json!({"start_block": 1, "end_block": predicate_end_block})), + Some(uuid), + ), + }; + start_chainhook_service( + chainhook_service_port, + stacks_rpc_port, + stacks_ingestion_port, + &working_dir, + &tsv_dir, + ) + .await; + let res = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap(); + let res = res.as_object().unwrap(); + let status = res.get("status").unwrap(); + assert_eq!(status, &json!(200)); + + match get_predicate_status(uuid, chainhook_service_port).await { + PredicateStatus::New => {} + _ => panic!("initially registered predicate should have new status"), + } + for i in 0..blocks_to_mine { + mine_stacks_block( + stacks_ingestion_port, + i + starting_chain_tip, + i + starting_chain_tip + 100, + ) + .await; + } + sleep(Duration::new(2, 0)); + let result = get_predicate_status(uuid, chainhook_service_port).await; + std::fs::remove_dir_all(working_dir).unwrap(); + result +} diff --git a/components/chainhook-cli/src/storage/mod.rs b/components/chainhook-cli/src/storage/mod.rs index 496d701c2..2304a722f 100644 --- a/components/chainhook-cli/src/storage/mod.rs +++ b/components/chainhook-cli/src/storage/mod.rs @@ -28,12 +28,29 @@ fn get_default_stacks_db_file_path(base_dir: &PathBuf) -> PathBuf { destination_path } -pub fn open_readonly_stacks_db_conn(base_dir: &PathBuf, _ctx: &Context) -> Result { +pub fn open_readonly_stacks_db_conn(base_dir: &PathBuf, ctx: &Context) -> Result { let path = get_default_stacks_db_file_path(&base_dir); let opts = get_db_default_options(); - let db = DB::open_for_read_only(&opts, path, false) - .map_err(|e| format!("unable to open stacks.rocksdb: {}", e.to_string()))?; - Ok(db) + match DB::open_for_read_only(&opts, path.clone(), false) { + Ok(db) => Ok(db), + Err(e) => { + if e.to_string() + .contains("IO error: No such file or directory") + { + return match open_readwrite_stacks_db_conn(base_dir, ctx) { + Ok(_) => { + let db = DB::open_for_read_only(&opts, path, false).map_err(|e| { + format!("unable to open stacks.rocksdb: {}", e.to_string()) + })?; + Ok(db) + } + Err(e) => Err(e), + }; + } else { + return Err(format!("unable to open stacks.rocksdb: {}", e.to_string())); + } + } + } } pub fn open_readwrite_stacks_db_conn(base_dir: &PathBuf, _ctx: &Context) -> Result { diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index 39485d1f9..f6ce4a596 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -59,25 +59,33 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( ) -> ( Vec>, BTreeMap<&'a str, &'a BlockIdentifier>, + BTreeMap<&'a str, &'a BlockIdentifier>, ) { let mut evaluated_predicates = BTreeMap::new(); let mut triggered_predicates = vec![]; + let mut expired_predicates = BTreeMap::new(); + match chain_event { BitcoinChainEvent::ChainUpdatedWithBlocks(event) => { for chainhook in active_chainhooks.iter() { let mut apply = vec![]; let rollback = vec![]; + let end_block = chainhook.end_block.unwrap_or(u64::MAX); for block in event.new_blocks.iter() { evaluated_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); - let mut hits = vec![]; - for tx in block.transactions.iter() { - if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { - hits.push(tx); + if end_block > block.block_identifier.index { + let mut hits = vec![]; + for tx in block.transactions.iter() { + if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { + hits.push(tx); + } } - } - if hits.len() > 0 { - apply.push((hits, block)); + if hits.len() > 0 { + apply.push((hits, block)); + } + } else { + expired_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); } } @@ -94,28 +102,37 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( for chainhook in active_chainhooks.iter() { let mut apply = vec![]; let mut rollback = vec![]; + let end_block = chainhook.end_block.unwrap_or(u64::MAX); for block in event.blocks_to_rollback.iter() { - let mut hits = vec![]; - for tx in block.transactions.iter() { - if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { - hits.push(tx); + if end_block > block.block_identifier.index { + let mut hits = vec![]; + for tx in block.transactions.iter() { + if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { + hits.push(tx); + } } - } - if hits.len() > 0 { - rollback.push((hits, block)); + if hits.len() > 0 { + rollback.push((hits, block)); + } + } else { + expired_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); } } for block in event.blocks_to_apply.iter() { evaluated_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); - let mut hits = vec![]; - for tx in block.transactions.iter() { - if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { - hits.push(tx); + if end_block > block.block_identifier.index { + let mut hits = vec![]; + for tx in block.transactions.iter() { + if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { + hits.push(tx); + } } - } - if hits.len() > 0 { - apply.push((hits, block)); + if hits.len() > 0 { + apply.push((hits, block)); + } + } else { + expired_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); } } if !apply.is_empty() || !rollback.is_empty() { @@ -128,7 +145,11 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( } } } - (triggered_predicates, evaluated_predicates) + ( + triggered_predicates, + evaluated_predicates, + expired_predicates, + ) } pub fn serialize_bitcoin_payload_to_json<'a>( diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 2cb5c4585..d4ba4a808 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -67,9 +67,11 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( ) -> ( Vec>, BTreeMap<&'a str, &'a BlockIdentifier>, + BTreeMap<&'a str, &'a BlockIdentifier>, ) { let mut triggered_predicates = vec![]; let mut evaluated_predicates = BTreeMap::new(); + let mut expired_predicates = BTreeMap::new(); match chain_event { StacksChainEvent::ChainUpdatedWithBlocks(update) => { for chainhook in active_chainhooks.iter() { @@ -84,26 +86,35 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( for parents_microblock_to_apply in block_update.parent_microblocks_to_apply.iter() { - apply.append(&mut evaluate_stacks_chainhook_on_blocks( - vec![parents_microblock_to_apply], - chainhook, - ctx, - )); + let (mut occurrences, mut expirations) = + evaluate_stacks_chainhook_on_blocks( + vec![parents_microblock_to_apply], + chainhook, + ctx, + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } for parents_microblock_to_rolllback in block_update.parent_microblocks_to_rollback.iter() { - rollback.append(&mut evaluate_stacks_chainhook_on_blocks( - vec![parents_microblock_to_rolllback], - chainhook, - ctx, - )); + let (mut occurrences, mut expirations) = + evaluate_stacks_chainhook_on_blocks( + vec![parents_microblock_to_rolllback], + chainhook, + ctx, + ); + rollback.append(&mut occurrences); + expired_predicates.append(&mut expirations); } - apply.append(&mut evaluate_stacks_chainhook_on_blocks( + + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![&block_update.block], chainhook, ctx, - )); + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } if !apply.is_empty() || !rollback.is_empty() { triggered_predicates.push(StacksTriggerChainhook { @@ -124,11 +135,14 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( chainhook.uuid.as_str(), µblock_to_apply.metadata.anchor_block_identifier, ); - apply.append(&mut evaluate_stacks_chainhook_on_blocks( + + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![microblock_to_apply], chainhook, ctx, - )); + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } if !apply.is_empty() || !rollback.is_empty() { triggered_predicates.push(StacksTriggerChainhook { @@ -149,18 +163,22 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( chainhook.uuid.as_str(), µblock_to_apply.metadata.anchor_block_identifier, ); - apply.append(&mut evaluate_stacks_chainhook_on_blocks( + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![microblock_to_apply], chainhook, ctx, - )); + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } for microblock_to_rollback in update.microblocks_to_rollback.iter() { - rollback.append(&mut evaluate_stacks_chainhook_on_blocks( + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![microblock_to_rollback], chainhook, ctx, - )); + ); + rollback.append(&mut occurrences); + expired_predicates.append(&mut expirations); } if !apply.is_empty() || !rollback.is_empty() { triggered_predicates.push(StacksTriggerChainhook { @@ -184,33 +202,44 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( for parents_microblock_to_apply in block_update.parent_microblocks_to_apply.iter() { - apply.append(&mut evaluate_stacks_chainhook_on_blocks( - vec![parents_microblock_to_apply], - chainhook, - ctx, - )); + let (mut occurrences, mut expirations) = + evaluate_stacks_chainhook_on_blocks( + vec![parents_microblock_to_apply], + chainhook, + ctx, + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } - apply.append(&mut evaluate_stacks_chainhook_on_blocks( + + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![&block_update.block], chainhook, ctx, - )); + ); + apply.append(&mut occurrences); + expired_predicates.append(&mut expirations); } for block_update in update.blocks_to_rollback.iter() { for parents_microblock_to_rollback in block_update.parent_microblocks_to_rollback.iter() { - rollback.append(&mut evaluate_stacks_chainhook_on_blocks( - vec![parents_microblock_to_rollback], - chainhook, - ctx, - )); + let (mut occurrences, mut expirations) = + evaluate_stacks_chainhook_on_blocks( + vec![parents_microblock_to_rollback], + chainhook, + ctx, + ); + rollback.append(&mut occurrences); + expired_predicates.append(&mut expirations); } - rollback.append(&mut evaluate_stacks_chainhook_on_blocks( + let (mut occurrences, mut expirations) = evaluate_stacks_chainhook_on_blocks( vec![&block_update.block], chainhook, ctx, - )); + ); + rollback.append(&mut occurrences); + expired_predicates.append(&mut expirations); } if !apply.is_empty() || !rollback.is_empty() { triggered_predicates.push(StacksTriggerChainhook { @@ -222,33 +251,48 @@ pub fn evaluate_stacks_chainhooks_on_chain_event<'a>( } } } - (triggered_predicates, evaluated_predicates) + ( + triggered_predicates, + evaluated_predicates, + expired_predicates, + ) } pub fn evaluate_stacks_chainhook_on_blocks<'a>( blocks: Vec<&'a dyn AbstractStacksBlock>, chainhook: &'a StacksChainhookSpecification, ctx: &Context, -) -> Vec<(Vec<&'a StacksTransactionData>, &'a dyn AbstractStacksBlock)> { +) -> ( + Vec<(Vec<&'a StacksTransactionData>, &'a dyn AbstractStacksBlock)>, + BTreeMap<&'a str, &'a BlockIdentifier>, +) { let mut occurrences = vec![]; + let mut expired_predicates = BTreeMap::new(); + let end_block = chainhook.end_block.unwrap_or(u64::MAX); for block in blocks { - let mut hits = vec![]; - if chainhook.is_predicate_targeting_block_header() { - for tx in block.get_transactions().iter() { - hits.push(tx); - } - } else { - for tx in block.get_transactions().iter() { - if evaluate_stacks_predicate_on_transaction(tx, chainhook, ctx) { + if end_block > block.get_identifier().index { + let mut hits = vec![]; + if chainhook.is_predicate_targeting_block_header() + && evaluate_stacks_predicate_on_block(block, chainhook, ctx) + { + for tx in block.get_transactions().iter() { hits.push(tx); } + } else { + for tx in block.get_transactions().iter() { + if evaluate_stacks_predicate_on_transaction(tx, chainhook, ctx) { + hits.push(tx); + } + } } - } - if hits.len() > 0 { - occurrences.push((hits, block)); + if hits.len() > 0 { + occurrences.push((hits, block)); + } + } else { + expired_predicates.insert(chainhook.uuid.as_str(), block.get_identifier()); } } - occurrences + (occurrences, expired_predicates) } pub fn evaluate_stacks_predicate_on_block<'a>( diff --git a/components/chainhook-sdk/src/chainhooks/tests/mod.rs b/components/chainhook-sdk/src/chainhooks/tests/mod.rs index a3a458d93..021c4ae70 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/tests/mod.rs @@ -351,10 +351,11 @@ fn test_stacks_predicates( predicate: predicate, action: HookAction::Noop, enabled: true, + expired_at: None, }; let predicates = vec![&chainhook]; - let (triggered, _blocks) = + let (triggered, _predicates_evaluated, _expired) = evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); if expected_applies == 0 { @@ -373,7 +374,7 @@ fn test_stacks_predicates( #[test_case( StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("*".to_string())), 1; - "Deployer predicate wildcard deployer catches all occurences" + "Deployer predicate wildcard deployer catches all occurrences" )] #[test_case( StacksPredicate::ContractDeployment(StacksContractDeploymentPredicate::Deployer("wrong-deployer".to_string())), @@ -429,10 +430,11 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap predicate: predicate, action: HookAction::Noop, enabled: true, + expired_at: None, }; let predicates = vec![&chainhook]; - let (triggered, _blocks) = + let (triggered, _predicates_evaluated, _predicates_expired) = evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); if expected_applies == 0 { @@ -513,10 +515,11 @@ fn test_stacks_predicate_contract_call(predicate: StacksPredicate, expected_appl predicate: predicate, action: HookAction::Noop, enabled: true, + expired_at: None, }; let predicates = vec![&chainhook]; - let (triggered, _blocks) = + let (triggered, _predicates_evaluated, _predicates_expired) = evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); if expected_applies == 0 { @@ -548,6 +551,7 @@ fn test_stacks_hook_action_noop() { )), action: HookAction::Noop, enabled: true, + expired_at: None, }; let apply_block_data = fixtures::build_stacks_testnet_block_with_contract_call(); @@ -606,6 +610,7 @@ fn test_stacks_hook_action_file_append() { path: "./".to_string(), }), enabled: true, + expired_at: None, }; let events = get_all_event_types(); let mut apply_blocks = vec![]; @@ -649,6 +654,6 @@ fn test_stacks_hook_action_file_append() { let expected = get_expected_occurrence(); assert_eq!(expected, actual); } else { - panic!("wrong occurence type"); + panic!("wrong occurrence type"); } } diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 12e903fb3..44f73f471 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -4,7 +4,6 @@ use chainhook_types::{BitcoinNetwork, StacksNetwork}; use reqwest::Url; use serde::ser::{SerializeSeq, Serializer}; use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; use schemars::JsonSchema; @@ -131,6 +130,30 @@ impl ChainhookConfig { } None } + + pub fn expire_stacks_hook(&mut self, hook_uuid: String, block_height: u64) { + let mut i = 0; + while i < self.stacks_chainhooks.len() { + if self.stacks_chainhooks[i].uuid == hook_uuid { + self.stacks_chainhooks[i].expired_at = Some(block_height); + break; + } else { + i += 1; + } + } + } + + pub fn expire_bitcoin_hook(&mut self, hook_uuid: String, block_height: u64) { + let mut i = 0; + while i < self.bitcoin_chainhooks.len() { + if self.bitcoin_chainhooks[i].uuid == hook_uuid { + self.bitcoin_chainhooks[i].expired_at = Some(block_height); + break; + } else { + i += 1; + } + } + } } impl Serialize for ChainhookConfig { @@ -178,23 +201,6 @@ impl ChainhookSpecification { format!("predicate:{}", uuid) } - pub fn into_serialized_json(&self) -> JsonValue { - match &self { - Self::Stacks(data) => json!({ - "chain": "stacks", - "uuid": data.uuid, - "network": data.network, - "predicate": data.predicate, - }), - Self::Bitcoin(data) => json!({ - "chain": "bitcoin", - "uuid": data.uuid, - "network": data.network, - "predicate": data.predicate, - }), - } - } - pub fn key(&self) -> String { match &self { Self::Bitcoin(data) => Self::bitcoin_key(&data.uuid), @@ -226,6 +232,13 @@ impl ChainhookSpecification { } Ok(()) } + + pub fn start_block(&self) -> Option { + match &self { + Self::Bitcoin(data) => data.start_block, + Self::Stacks(data) => data.start_block, + } + } } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] @@ -251,6 +264,7 @@ pub struct BitcoinChainhookSpecification { pub include_outputs: bool, pub include_witness: bool, pub enabled: bool, + pub expired_at: Option, } impl BitcoinChainhookSpecification { @@ -336,6 +350,7 @@ impl BitcoinChainhookFullSpecification { include_outputs: spec.include_outputs.unwrap_or(false), include_witness: spec.include_witness.unwrap_or(false), enabled: false, + expired_at: None, }) } } @@ -398,6 +413,7 @@ impl StacksChainhookFullSpecification { predicate: spec.predicate, action: spec.action, enabled: false, + expired_at: None, }) } } @@ -720,6 +736,7 @@ pub struct StacksChainhookSpecification { pub predicate: StacksPredicate, pub action: HookAction, pub enabled: bool, + pub expired_at: Option, } impl StacksChainhookSpecification { diff --git a/components/chainhook-sdk/src/indexer/stacks/mod.rs b/components/chainhook-sdk/src/indexer/stacks/mod.rs index 12460a6ff..388594aeb 100644 --- a/components/chainhook-sdk/src/indexer/stacks/mod.rs +++ b/components/chainhook-sdk/src/indexer/stacks/mod.rs @@ -18,7 +18,7 @@ use std::convert::TryInto; use std::io::Cursor; use std::str; -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] pub struct NewBlock { pub block_height: u64, pub block_hash: String, @@ -44,7 +44,7 @@ pub struct NewBlockHeader { pub parent_index_block_hash: Option, } -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] pub struct MaturedMinerReward { pub from_index_consensus_hash: String, pub from_stacks_block_hash: String, @@ -68,7 +68,7 @@ pub struct NewMicroblockTrail { pub events: Vec, } -#[derive(Deserialize, Debug)] +#[derive(Deserialize, Serialize, Debug)] pub struct NewTransaction { pub txid: String, pub tx_index: usize, @@ -91,7 +91,7 @@ pub struct NewMicroblockTransaction { pub microblock_parent_hash: String, } -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct NewEvent { pub txid: String, pub committed: bool, diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 33f031d26..0c602ddac 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -216,10 +216,18 @@ pub enum ObserverCommand { EnablePredicate(ChainhookSpecification), DeregisterBitcoinPredicate(String), DeregisterStacksPredicate(String), + ExpireBitcoinPredicate(HookExpirationData), + ExpireStacksPredicate(HookExpirationData), NotifyBitcoinTransactionProxied, Terminate, } +#[derive(Clone, Debug, PartialEq)] +pub struct HookExpirationData { + pub hook_uuid: String, + pub block_height: u64, +} + #[derive(Clone, Debug, PartialEq)] pub enum StacksChainMempoolEvent { TransactionsAdmitted(Vec), @@ -236,6 +244,7 @@ pub struct MempoolAdmissionData { pub struct PredicateEvaluationReport { pub predicates_evaluated: BTreeMap>, pub predicates_triggered: BTreeMap>, + pub predicates_expired: BTreeMap>, } impl PredicateEvaluationReport { @@ -243,6 +252,7 @@ impl PredicateEvaluationReport { PredicateEvaluationReport { predicates_evaluated: BTreeMap::new(), predicates_triggered: BTreeMap::new(), + predicates_expired: BTreeMap::new(), } } @@ -273,6 +283,19 @@ impl PredicateEvaluationReport { }); } } + + pub fn track_expiration(&mut self, uuid: &str, block_identifier: &BlockIdentifier) { + self.predicates_expired + .entry(uuid.to_string()) + .and_modify(|e| { + e.insert(block_identifier.clone()); + }) + .or_insert_with(|| { + let mut set = BTreeSet::new(); + set.insert(block_identifier.clone()); + set + }); + } } #[derive(Clone, Debug)] @@ -1010,6 +1033,7 @@ pub async fn start_observer_commands_handler( .bitcoin_chainhooks .iter() .filter(|p| p.enabled) + .filter(|p| p.expired_at.is_none()) .collect::>(); ctx.try_log(|logger| { slog::info!( @@ -1019,15 +1043,19 @@ pub async fn start_observer_commands_handler( ) }); - let (predicates_triggered, predicates_evaluated) = + let (predicates_triggered, predicates_evaluated, predicates_expired) = evaluate_bitcoin_chainhooks_on_chain_event( &chain_event, &bitcoin_chainhooks, &ctx, ); + for (uuid, block_identifier) in predicates_evaluated.into_iter() { report.track_evaluation(uuid, block_identifier); } + for (uuid, block_identifier) in predicates_expired.into_iter() { + report.track_expiration(uuid, block_identifier); + } for entry in predicates_triggered.iter() { let blocks_ids = entry .apply @@ -1051,6 +1079,11 @@ pub async fn start_observer_commands_handler( let mut total_occurrences: u64 = *chainhooks_occurrences_tracker .get(&trigger.chainhook.uuid) .unwrap_or(&0); + // todo: this currently is only additive, and an occurrence means we match a chain event, + // rather than the number of blocks. Should we instead add to the total occurrences for + // every apply block, and subtract for every rollback? If we did this, we could set the + // status to `Expired` when we go above `expire_after_occurrence` occurrences, rather than + // deregistering total_occurrences += 1; let limit = trigger.chainhook.expire_after_occurrence.unwrap_or(0); @@ -1118,12 +1151,6 @@ pub async fn start_observer_commands_handler( .predicates .deregister_bitcoin_hook(hook_uuid.clone()) { - if let Some(ref tx) = observer_events_tx { - let _ = tx.send(ObserverEvent::PredicateDeregistered( - ChainhookSpecification::Bitcoin(chainhook), - )); - } - match observer_metrics.write() { Ok(mut metrics) => metrics.bitcoin.deregister_prediate(), Err(e) => ctx.try_log(|logger| { @@ -1134,6 +1161,12 @@ pub async fn start_observer_commands_handler( ) }), } + + if let Some(ref tx) = observer_events_tx { + let _ = tx.send(ObserverEvent::PredicateDeregistered( + ChainhookSpecification::Bitcoin(chainhook), + )); + } } } @@ -1158,6 +1191,7 @@ pub async fn start_observer_commands_handler( .stacks_chainhooks .iter() .filter(|p| p.enabled) + .filter(|p| p.expired_at.is_none()) .collect::>(); ctx.try_log(|logger| { slog::info!( @@ -1228,7 +1262,7 @@ pub async fn start_observer_commands_handler( } // process hooks - let (predicates_triggered, predicates_evaluated) = + let (predicates_triggered, predicates_evaluated, predicates_expired) = evaluate_stacks_chainhooks_on_chain_event( &chain_event, stacks_chainhooks, @@ -1237,6 +1271,9 @@ pub async fn start_observer_commands_handler( for (uuid, block_identifier) in predicates_evaluated.into_iter() { report.track_evaluation(uuid, block_identifier); } + for (uuid, block_identifier) in predicates_expired.into_iter() { + report.track_expiration(uuid, block_identifier); + } for entry in predicates_triggered.iter() { let blocks_ids = entry .apply @@ -1305,14 +1342,9 @@ pub async fn start_observer_commands_handler( .predicates .deregister_stacks_hook(hook_uuid.clone()) { - if let Some(ref tx) = observer_events_tx { - let _ = tx.send(ObserverEvent::PredicateDeregistered( - ChainhookSpecification::Stacks(chainhook), - )); - } - match observer_metrics.write() { Ok(mut metrics) => metrics.stacks.deregister_prediate(), + Err(e) => ctx.try_log(|logger| { slog::warn!( logger, @@ -1321,6 +1353,12 @@ pub async fn start_observer_commands_handler( ) }), } + + if let Some(ref tx) = observer_events_tx { + let _ = tx.send(ObserverEvent::PredicateDeregistered( + ChainhookSpecification::Stacks(chainhook), + )); + } } } @@ -1372,16 +1410,10 @@ pub async fn start_observer_commands_handler( e.to_string() ) }); - continue; + panic!("Unable to register new chainhook spec: {}", e.to_string()); + //continue; } }; - ctx.try_log(|logger| slog::info!(logger, "Registering chainhook {}", spec.uuid(),)); - if let Some(ref tx) = observer_events_tx { - let _ = tx.send(ObserverEvent::PredicateRegistered(spec.clone())); - } else { - ctx.try_log(|logger| slog::info!(logger, "Enabling Predicate {}", spec.uuid())); - chainhook_store.predicates.enable_specification(&mut spec); - } match observer_metrics.write() { Ok(mut metrics) => match spec { @@ -1396,6 +1428,14 @@ pub async fn start_observer_commands_handler( slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) }), }; + + ctx.try_log(|logger| slog::info!(logger, "Registering chainhook {}", spec.uuid(),)); + if let Some(ref tx) = observer_events_tx { + let _ = tx.send(ObserverEvent::PredicateRegistered(spec.clone())); + } else { + ctx.try_log(|logger| slog::info!(logger, "Enabling Predicate {}", spec.uuid())); + chainhook_store.predicates.enable_specification(&mut spec); + } } ObserverCommand::EnablePredicate(mut spec) => { ctx.try_log(|logger| slog::info!(logger, "Enabling Predicate {}", spec.uuid())); @@ -1409,11 +1449,6 @@ pub async fn start_observer_commands_handler( slog::info!(logger, "Handling DeregisterStacksPredicate command") }); let hook = chainhook_store.predicates.deregister_stacks_hook(hook_uuid); - if let (Some(tx), Some(hook)) = (&observer_events_tx, hook) { - let _ = tx.send(ObserverEvent::PredicateDeregistered( - ChainhookSpecification::Stacks(hook), - )); - } match observer_metrics.write() { Ok(mut metrics) => metrics.stacks.deregister_prediate(), @@ -1421,6 +1456,12 @@ pub async fn start_observer_commands_handler( slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) }), } + + if let (Some(tx), Some(hook)) = (&observer_events_tx, hook) { + let _ = tx.send(ObserverEvent::PredicateDeregistered( + ChainhookSpecification::Stacks(hook), + )); + } } ObserverCommand::DeregisterBitcoinPredicate(hook_uuid) => { ctx.try_log(|logger| { @@ -1429,19 +1470,40 @@ pub async fn start_observer_commands_handler( let hook = chainhook_store .predicates .deregister_bitcoin_hook(hook_uuid); + + match observer_metrics.write() { + Ok(mut metrics) => metrics.bitcoin.deregister_prediate(), + Err(e) => ctx.try_log(|logger| { + slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) + }), + } + if let (Some(tx), Some(hook)) = (&observer_events_tx, hook) { let _ = tx.send(ObserverEvent::PredicateDeregistered( ChainhookSpecification::Bitcoin(hook), )); - - match observer_metrics.write() { - Ok(mut metrics) => metrics.bitcoin.deregister_prediate(), - Err(e) => ctx.try_log(|logger| { - slog::warn!(logger, "unable to acquire observer_metrics_rw_lock:{}", e) - }), - } } } + ObserverCommand::ExpireStacksPredicate(HookExpirationData { + hook_uuid, + block_height, + }) => { + ctx.try_log(|logger| slog::info!(logger, "Handling ExpireStacksPredicate command")); + chainhook_store + .predicates + .expire_stacks_hook(hook_uuid, block_height); + } + ObserverCommand::ExpireBitcoinPredicate(HookExpirationData { + hook_uuid, + block_height, + }) => { + ctx.try_log(|logger| { + slog::info!(logger, "Handling ExpireBitcoinPredicate command") + }); + chainhook_store + .predicates + .expire_bitcoin_hook(hook_uuid, block_height); + } } } Ok(()) diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index d9864fafd..1efea079d 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -233,6 +233,102 @@ fn generate_and_register_new_bitcoin_chainhook( chainhook } +fn assert_predicates_triggered_event( + observer_events_rx: &crossbeam_channel::Receiver, + expected_len: usize, +) { + assert!( + match observer_events_rx.recv() { + Ok(ObserverEvent::PredicatesTriggered(len)) => { + assert_eq!( + len, expected_len, + "expected {} predicate(s) to be triggered", + expected_len + ); + true + } + _ => false, + }, + "expected PredicatesTriggered event to occur" + ); +} + +fn assert_stacks_chain_event(observer_events_rx: &crossbeam_channel::Receiver) { + assert!( + match observer_events_rx.recv() { + Ok(ObserverEvent::StacksChainEvent(_)) => { + true + } + _ => false, + }, + "expected StacksChainEvent event to occur" + ); +} + +fn assert_observer_metrics_stacks_registered_predicates( + observer_metrics_rw_lock: &Arc>, + expected_count: usize, +) { + assert_eq!( + expected_count, + observer_metrics_rw_lock + .read() + .unwrap() + .stacks + .registered_predicates, + "expected {} registered stacks hooks", + expected_count + ); +} + +fn assert_observer_metrics_stacks_deregistered_predicates( + observer_metrics_rw_lock: &Arc>, + expected_count: usize, +) { + assert_eq!( + expected_count, + observer_metrics_rw_lock + .read() + .unwrap() + .stacks + .deregistered_predicates, + "expected {} deregistered stacks hooks", + expected_count + ); +} + +fn assert_observer_metrics_bitcoin_registered_predicates( + observer_metrics_rw_lock: &Arc>, + expected_count: usize, +) { + assert_eq!( + expected_count, + observer_metrics_rw_lock + .read() + .unwrap() + .bitcoin + .registered_predicates, + "expected {} registered bitcoin hooks", + expected_count + ); +} + +fn assert_observer_metrics_bitcoin_deregistered_predicates( + observer_metrics_rw_lock: &Arc>, + expected_count: usize, +) { + assert_eq!( + expected_count, + observer_metrics_rw_lock + .read() + .unwrap() + .bitcoin + .deregistered_predicates, + "expected {} deregistered bitcoin hooks", + expected_count + ); +} + fn generate_and_register_new_ordinals_chainhook( observer_commands_tx: &Sender, observer_events_rx: &crossbeam_channel::Receiver, @@ -295,14 +391,7 @@ fn test_stacks_chainhook_register_deregister() { ); // registering stacks chainhook should increment the observer_metric's registered stacks hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .registered_predicates - ); + assert_observer_metrics_stacks_registered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -326,20 +415,9 @@ fn test_stacks_chainhook_register_deregister() { }); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Simulate a block that does include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -357,30 +435,30 @@ fn test_stacks_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); - - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksPredicateTriggered(payload)) => { - assert_eq!(payload.apply.len(), 1); - assert_eq!(payload.apply[0].transactions.len(), 1); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 1); + + assert!( + match observer_events_rx.recv() { + Ok(ObserverEvent::StacksPredicateTriggered(payload)) => { + assert_eq!( + payload.apply.len(), + 1, + "expected 1 predicate to be triggered" + ); + assert_eq!( + payload.apply[0].transactions.len(), + 1, + "expected triggered predicate to have 1 transaction" + ); + true + } + _ => false, + }, + "expected StacksPredicateTriggered event to occur" + ); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Simulate a block that does include 2 trigger let transactions = vec![ @@ -414,13 +492,7 @@ fn test_stacks_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 1); assert!(match observer_events_rx.recv() { Ok(ObserverEvent::StacksPredicateTriggered(payload)) => { @@ -432,12 +504,7 @@ fn test_stacks_chainhook_register_deregister() { }); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Deregister the hook let _ = observer_commands_tx.send(ObserverCommand::DeregisterStacksPredicate( @@ -455,23 +522,9 @@ fn test_stacks_chainhook_register_deregister() { }); // deregistering stacks chainhook should decrement the observer_metric's registered stacks hooks - assert_eq!( - 0, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .registered_predicates - ); + assert_observer_metrics_stacks_registered_predicates(&observer_metrics_rw_lock, 0); // and increment the deregistered hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .deregistered_predicates - ); + assert_observer_metrics_stacks_deregistered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -489,20 +542,9 @@ fn test_stacks_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Simulate a block that does include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -520,20 +562,9 @@ fn test_stacks_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); let _ = observer_commands_tx.send(ObserverCommand::Terminate); handle.join().expect("unable to terminate thread"); @@ -584,14 +615,7 @@ fn test_stacks_chainhook_auto_deregister() { _ => false, }); // registering stacks chainhook should increment the observer_metric's registered stacks hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .registered_predicates - ); + assert_observer_metrics_stacks_registered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -614,24 +638,22 @@ fn test_stacks_chainhook_auto_deregister() { _ => false, }); - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - Ok(e) => { - println!("{:?}", e); - true - } - _ => false, - }); + assert!( + match observer_events_rx.recv() { + Ok(ObserverEvent::PredicatesTriggered(len)) => { + assert_eq!(len, 0); + true + } + Ok(e) => { + println!("{:?}", e); + true + } + _ => false, + }, + "expected PredicatesTriggered event to occur" + ); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Simulate a block that does include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -648,14 +670,8 @@ fn test_stacks_chainhook_auto_deregister() { confirmed_blocks: vec![], }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); - // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); + // Should signal that hooks were triggered + assert_predicates_triggered_event(&observer_events_rx, 1); assert!(match observer_events_rx.recv() { Ok(ObserverEvent::StacksPredicateTriggered(_)) => { @@ -665,12 +681,7 @@ fn test_stacks_chainhook_auto_deregister() { }); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - _ => false, - }); + assert_stacks_chain_event(&observer_events_rx); // Simulate another block that does include a trigger let transactions = vec![generate_test_tx_stacks_contract_call( @@ -688,13 +699,8 @@ fn test_stacks_chainhook_auto_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateStacksChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should signal that a hook was deregistered assert!(match observer_events_rx.recv() { Ok(ObserverEvent::PredicateDeregistered(deregistered_hook)) => { @@ -705,38 +711,12 @@ fn test_stacks_chainhook_auto_deregister() { }); // deregistering stacks chainhook should decrement the observer_metric's registered stacks hooks - assert_eq!( - 0, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .registered_predicates - ); + assert_observer_metrics_stacks_registered_predicates(&observer_metrics_rw_lock, 0); // and increment the deregistered hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .stacks - .deregistered_predicates - ); + assert_observer_metrics_stacks_deregistered_predicates(&observer_metrics_rw_lock, 1); // Should propagate block - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::StacksChainEvent(_)) => { - true - } - Ok(event) => { - println!("Unexpected event: {:?}", event); - false - } - Err(e) => { - println!("Error: {:?}", e); - false - } - }); + assert_stacks_chain_event(&observer_events_rx); let _ = observer_commands_tx.send(ObserverCommand::Terminate); handle.join().expect("unable to terminate thread"); @@ -773,14 +753,7 @@ fn test_bitcoin_chainhook_register_deregister() { ); // registering bitcoin chainhook should increment the observer_metric's registered bitcoin hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .registered_predicates - ); + assert_observer_metrics_bitcoin_registered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger (wallet_1 to wallet_3) let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( @@ -797,20 +770,7 @@ fn test_bitcoin_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - Ok(event) => { - println!("Unexpected event: {:?}", event); - false - } - Err(e) => { - println!("Error: {:?}", e); - false - } - }); + assert_predicates_triggered_event(&observer_events_rx, 0); // Should propagate block assert!(match observer_events_rx.recv() { @@ -835,14 +795,8 @@ fn test_bitcoin_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); - // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); + // Should signal that 1 hook was triggered + assert_predicates_triggered_event(&observer_events_rx, 1); assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinPredicateTriggered(payload)) => { @@ -890,14 +844,8 @@ fn test_bitcoin_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); - // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); + // Should signal that 1 hook was triggered + assert_predicates_triggered_event(&observer_events_rx, 1); assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinPredicateTriggered(payload)) => { @@ -932,23 +880,9 @@ fn test_bitcoin_chainhook_register_deregister() { }); // deregistering bitcoin chainhook should decrement the observer_metric's registered bitcoin hooks - assert_eq!( - 0, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .registered_predicates - ); + assert_observer_metrics_bitcoin_registered_predicates(&observer_metrics_rw_lock, 0); // and increment the deregistered hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .deregistered_predicates - ); + assert_observer_metrics_bitcoin_deregistered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( @@ -966,13 +900,8 @@ fn test_bitcoin_chainhook_register_deregister() { let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should propagate block assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinChainEvent(_)) => { @@ -996,13 +925,8 @@ fn test_bitcoin_chainhook_register_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should propagate block assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinChainEvent(_)) => { @@ -1046,14 +970,7 @@ fn test_bitcoin_chainhook_auto_deregister() { ); // registering bitcoin chainhook should increment the observer_metric's registered bitcoin hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .registered_predicates - ); + assert_observer_metrics_bitcoin_registered_predicates(&observer_metrics_rw_lock, 1); // Simulate a block that does not include a trigger (wallet_1 to wallet_3) let transactions = vec![generate_test_tx_bitcoin_p2pkh_transfer( @@ -1071,13 +988,8 @@ fn test_bitcoin_chainhook_auto_deregister() { let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should propagate block assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinChainEvent(_)) => { @@ -1102,14 +1014,8 @@ fn test_bitcoin_chainhook_auto_deregister() { }); let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); - // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 1); - true - } - _ => false, - }); + // Should signal that 1 hook was triggered + assert_predicates_triggered_event(&observer_events_rx, 1); assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinPredicateTriggered(_)) => { @@ -1143,13 +1049,8 @@ fn test_bitcoin_chainhook_auto_deregister() { let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should propagate block assert!(match observer_events_rx.recv() { Ok(ObserverEvent::BitcoinChainEvent(_)) => { @@ -1175,13 +1076,8 @@ fn test_bitcoin_chainhook_auto_deregister() { let _ = observer_commands_tx.send(ObserverCommand::PropagateBitcoinChainEvent(chain_event)); // Should signal that no hook were triggered - assert!(match observer_events_rx.recv() { - Ok(ObserverEvent::PredicatesTriggered(len)) => { - assert_eq!(len, 0); - true - } - _ => false, - }); + assert_predicates_triggered_event(&observer_events_rx, 0); + // Should signal that a hook was deregistered assert!(match observer_events_rx.recv() { Ok(ObserverEvent::PredicateDeregistered(deregistered_hook)) => { @@ -1192,23 +1088,9 @@ fn test_bitcoin_chainhook_auto_deregister() { }); // deregistering bitcoin chainhook should decrement the observer_metric's registered bitcoin hooks - assert_eq!( - 0, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .registered_predicates - ); + assert_observer_metrics_bitcoin_registered_predicates(&observer_metrics_rw_lock, 0); // and increment the deregistered hooks - assert_eq!( - 1, - observer_metrics_rw_lock - .read() - .unwrap() - .bitcoin - .deregistered_predicates - ); + assert_observer_metrics_bitcoin_deregistered_predicates(&observer_metrics_rw_lock, 1); // Should propagate block assert!(match observer_events_rx.recv() { diff --git a/components/chainhook-sdk/src/utils/mod.rs b/components/chainhook-sdk/src/utils/mod.rs index 22167c1d1..f6da8ef8c 100644 --- a/components/chainhook-sdk/src/utils/mod.rs +++ b/components/chainhook-sdk/src/utils/mod.rs @@ -149,57 +149,56 @@ pub async fn send_request( attempts_max: u16, attempts_interval_sec: u16, ctx: &Context, -) -> Result<(), ()> { +) -> Result<(), String> { let mut retry = 0; loop { let request_builder = match request_builder.try_clone() { Some(rb) => rb, None => { ctx.try_log(|logger| slog::warn!(logger, "unable to clone request builder")); - return Err(()); + return Err(format!( + "internal server error: unable to clone request builder" + )); } }; - match request_builder.send().await { + let err_msg = match request_builder.send().await { Ok(res) => { if res.status().is_success() { ctx.try_log(|logger| slog::info!(logger, "Trigger {} successful", res.url())); return Ok(()); } else { retry += 1; - ctx.try_log(|logger| { - slog::warn!( - logger, - "Trigger {} failed with status {}", - res.url(), - res.status() - ) - }); + let err_msg = + format!("Trigger {} failed with status {}", res.url(), res.status()); + ctx.try_log(|logger| slog::warn!(logger, "{}", err_msg)); + err_msg } } Err(e) => { retry += 1; - ctx.try_log(|logger| { - slog::warn!(logger, "unable to send request {}", e.to_string()) - }); + let err_msg = format!("unable to send request {}", e.to_string()); + ctx.try_log(|logger| slog::warn!(logger, "{}", err_msg)); + err_msg } - } + }; if retry >= attempts_max { - ctx.try_log(|logger| { - slog::warn!(logger, "unable to send request after several retries") - }); - return Err(()); + let msg: String = format!( + "unable to send request after several retries. most recent error: {}", + err_msg + ); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); + return Err(msg); } std::thread::sleep(std::time::Duration::from_secs(attempts_interval_sec.into())); } } -pub fn file_append(path: String, bytes: Vec, ctx: &Context) -> Result<(), ()> { +pub fn file_append(path: String, bytes: Vec, ctx: &Context) -> Result<(), String> { let mut file_path = match std::env::current_dir() { Err(e) => { - ctx.try_log(|logger| { - slog::warn!(logger, "unable to retrieve current_dir {}", e.to_string()) - }); - return Err(()); + let msg = format!("unable to retrieve current_dir {}", e.to_string()); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); + return Err(msg); } Ok(p) => p, }; @@ -210,15 +209,13 @@ pub fn file_append(path: String, bytes: Vec, ctx: &Context) -> Result<(), () let _ = file.write_all(&bytes); } Err(e) => { - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable to create file {}: {}", - file_path.display(), - e.to_string() - ) - }); - return Err(()); + let msg = format!( + "unable to create file {}: {}", + file_path.display(), + e.to_string() + ); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); + return Err(msg); } } } @@ -230,8 +227,9 @@ pub fn file_append(path: String, bytes: Vec, ctx: &Context) -> Result<(), () .open(file_path) { Err(e) => { - ctx.try_log(|logger| slog::warn!(logger, "unable to open file {}", e.to_string())); - return Err(()); + let msg = format!("unable to open file {}", e.to_string()); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); + return Err(msg); } Ok(p) => p, }; @@ -239,21 +237,17 @@ pub fn file_append(path: String, bytes: Vec, ctx: &Context) -> Result<(), () let utf8 = match String::from_utf8(bytes) { Ok(string) => string, Err(e) => { - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable serialize bytes as utf8 string {}", - e.to_string() - ) - }); - return Err(()); + let msg = format!("unable serialize bytes as utf8 string {}", e.to_string()); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); + return Err(msg); } }; if let Err(e) = writeln!(file, "{}", utf8) { - ctx.try_log(|logger| slog::warn!(logger, "unable to open file {}", e.to_string())); + let msg = format!("unable to open file {}", e.to_string()); + ctx.try_log(|logger| slog::warn!(logger, "{}", msg)); eprintln!("Couldn't write to file: {}", e); - return Err(()); + return Err(msg); } Ok(()) diff --git a/dockerfiles/components/chainhook-node.dockerfile b/dockerfiles/components/chainhook-node.dockerfile index 5fbd1db8c..7f50d74f4 100644 --- a/dockerfiles/components/chainhook-node.dockerfile +++ b/dockerfiles/components/chainhook-node.dockerfile @@ -4,7 +4,7 @@ WORKDIR /src RUN apt update && apt install -y ca-certificates pkg-config libssl-dev libclang-11-dev -RUN rustup update 1.67.0 && rustup default 1.67.0 +RUN rustup update 1.70.0 && rustup default 1.70.0 COPY ./components/chainhook-cli /src/components/chainhook-cli diff --git a/docs/images/predicate-status-flowchart/PredicateStatusFlowchart.excalidraw b/docs/images/predicate-status-flowchart/PredicateStatusFlowchart.excalidraw new file mode 100644 index 000000000..ea0a68f69 --- /dev/null +++ b/docs/images/predicate-status-flowchart/PredicateStatusFlowchart.excalidraw @@ -0,0 +1,2106 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 115, + "versionNonce": 776192013, + "isDeleted": false, + "id": "UjFEV39vA62xHmRyCWSK7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 449.421875, + "y": 207.65234375, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 119.8125, + "height": 60, + "seed": 573568707, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "ZE7lDcLAT02gRVQmoJnXa" + }, + { + "id": "UD4g2rtPMdMX76aHEISpO", + "type": "arrow" + }, + { + "id": "GITe4hkmrvQm2qJrc8t7t", + "type": "arrow" + } + ], + "updated": 1693246725368, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 53, + "versionNonce": 417452867, + "isDeleted": false, + "id": "ZE7lDcLAT02gRVQmoJnXa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 460.96875, + "y": 214.65234375, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 96.71875, + "height": 46, + "seed": 1247093507, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Predicate \nRegistered", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "UjFEV39vA62xHmRyCWSK7", + "originalText": "Predicate Registered", + "lineHeight": 1.15, + "baseline": 42 + }, + { + "type": "text", + "version": 99, + "versionNonce": 1028273773, + "isDeleted": false, + "id": "zKSW9tDVlAxKSh4c03IRw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 409.80290950583037, + "y": 155.15546228734917, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 221.259765625, + "height": 23, + "seed": 1447675757, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Chainhook internal event", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Chainhook internal event", + "lineHeight": 1.15, + "baseline": 19 + }, + { + "type": "text", + "version": 15, + "versionNonce": 1013740259, + "isDeleted": false, + "id": "ulrhrsP3bCg8l-5i5OfdS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 806.73046875, + "y": 171.51171875, + "strokeColor": "#fffefe", + "backgroundColor": "transparent", + "width": 41.142578125, + "height": 23, + "seed": 1667394467, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "St88", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "St88", + "lineHeight": 1.15, + "baseline": 19 + }, + { + "type": "text", + "version": 16, + "versionNonce": 1693638861, + "isDeleted": false, + "id": "U4geAUEooWO-tMaYj9N75", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 822.984375, + "y": 160.59375, + "strokeColor": "#fffefe", + "backgroundColor": "transparent", + "width": 57.8125, + "height": 23, + "seed": 1177292965, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "asdaD", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "asdaD", + "lineHeight": 1.15, + "baseline": 19 + }, + { + "type": "text", + "version": 52, + "versionNonce": 1086463619, + "isDeleted": false, + "id": "n5Zrr2oxW5fu_2iuise9s", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 761.06640625, + "y": 153.85546875, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 56.69921875, + "height": 23, + "seed": 104812043, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Status", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Status", + "lineHeight": 1.15, + "baseline": 19 + }, + { + "type": "rectangle", + "version": 136, + "versionNonce": 987184941, + "isDeleted": false, + "id": "oIz1vfaYEdHCDHe55ML85", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 734.12109375, + "y": 200.4609375, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 116, + "height": 60, + "seed": 1248398789, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "y9OfFloAQ08yICPUt4ENt" + }, + { + "id": "UD4g2rtPMdMX76aHEISpO", + "type": "arrow" + } + ], + "updated": 1693246725368, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 153, + "versionNonce": 1889621539, + "isDeleted": false, + "id": "y9OfFloAQ08yICPUt4ENt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 776.1171875, + "y": 221.2609375, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 32.0078125, + "height": 18.4, + "seed": 1607994373, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "New", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "oIz1vfaYEdHCDHe55ML85", + "originalText": "New", + "lineHeight": 1.15, + "baseline": 15 + }, + { + "type": "arrow", + "version": 56, + "versionNonce": 1700843917, + "isDeleted": false, + "id": "UD4g2rtPMdMX76aHEISpO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 575.43359375, + "y": 237.90625, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 144.51953125, + "height": 7.2265625, + "seed": 407840299, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "startBinding": { + "elementId": "UjFEV39vA62xHmRyCWSK7", + "focus": 0.10787658104469203, + "gap": 6.19921875 + }, + "endBinding": { + "elementId": "oIz1vfaYEdHCDHe55ML85", + "focus": 0.10303698493891769, + "gap": 14.16796875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 144.51953125, + -7.2265625 + ] + ] + }, + { + "type": "rectangle", + "version": 77, + "versionNonce": 725836451, + "isDeleted": false, + "id": "ZvmnqZNJc9EgAXmWaosEK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 451.30859375, + "y": 335.8671875, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 122.58984375, + "height": 62.125, + "seed": 596047819, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "cf8-xfK78OwT9blo_W07S" + }, + { + "id": "GITe4hkmrvQm2qJrc8t7t", + "type": "arrow" + }, + { + "id": "QZwGIHg6zCwxolwZCbUqW", + "type": "arrow" + }, + { + "id": "djLZxg7-dQzazao679PIu", + "type": "arrow" + }, + { + "id": "wT0WIuYwXK9qJaJbdcCZC", + "type": "arrow" + }, + { + "id": "WkYhnsevmXLh2XqowRPZx", + "type": "arrow" + } + ], + "updated": 1693323268825, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 45, + "versionNonce": 29956077, + "isDeleted": false, + "id": "cf8-xfK78OwT9blo_W07S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 468.1259765625, + "y": 343.9296875, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 88.955078125, + "height": 46, + "seed": 785147909, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Scanning \nBegins", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ZvmnqZNJc9EgAXmWaosEK", + "originalText": "Scanning Begins", + "lineHeight": 1.15, + "baseline": 42 + }, + { + "type": "arrow", + "version": 84, + "versionNonce": 753297763, + "isDeleted": false, + "id": "GITe4hkmrvQm2qJrc8t7t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 507.8048168187531, + "y": 276.203125, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 1.9888765502169576, + "height": 55.27734375, + "seed": 68704875, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693246725368, + "link": null, + "locked": false, + "startBinding": { + "elementId": "UjFEV39vA62xHmRyCWSK7", + "focus": 0.05547291428400007, + "gap": 8.55078125 + }, + "endBinding": { + "elementId": "ZvmnqZNJc9EgAXmWaosEK", + "focus": -0.024584171650176338, + "gap": 4.38671875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.9888765502169576, + 55.27734375 + ] + ] + }, + { + "type": "arrow", + "version": 710, + "versionNonce": 296045421, + "isDeleted": false, + "id": "QZwGIHg6zCwxolwZCbUqW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 574.8984375, + "y": 369.9349412775456, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 100.75641225658967, + "height": 2.640611566035318, + "seed": 1435301899, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323288384, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZvmnqZNJc9EgAXmWaosEK", + "gap": 1, + "focus": 0.1381729988434557 + }, + "endBinding": { + "elementId": "I44ZjRGQe17clLABwWI_0", + "gap": 9.548596947956753, + "focus": 0.09048922543133398 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 100.75641225658967, + -2.640611566035318 + ] + ] + }, + { + "type": "rectangle", + "version": 472, + "versionNonce": 1302164749, + "isDeleted": false, + "id": "I44ZjRGQe17clLABwWI_0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 685.2034467045464, + "y": 286.1482954047348, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 301, + "height": 170, + "seed": 327511045, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "g76NiXIvyHiE2XIoI09j4" + }, + { + "id": "QZwGIHg6zCwxolwZCbUqW", + "type": "arrow" + } + ], + "updated": 1693323288384, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 742, + "versionNonce": 1052323299, + "isDeleted": false, + "id": "g76NiXIvyHiE2XIoI09j4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 690.2034467045464, + "y": 297.54829540473486, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 284.6328125, + "height": 147.2, + "seed": 241410917, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323288384, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "Scanning:\n{\n number_of_blocks_to_scan: number,\n number_of_blocks_evaluated: number,\n number_of_times_triggered: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "I44ZjRGQe17clLABwWI_0", + "originalText": "Scanning:\n{\n number_of_blocks_to_scan: number,\n number_of_blocks_evaluated: number,\n number_of_times_triggered: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "lineHeight": 1.15, + "baseline": 143 + }, + { + "type": "arrow", + "version": 740, + "versionNonce": 1953915021, + "isDeleted": false, + "id": "djLZxg7-dQzazao679PIu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 456.2992116259511, + "y": 404.3939634938485, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 52.77049207145819, + "height": 333.28550289040726, + "seed": 1649129189, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323307829, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZvmnqZNJc9EgAXmWaosEK", + "focus": 0.6820987961010629, + "gap": 6.401775993848503 + }, + "endBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "focus": -1.055639275814804, + "gap": 12.611451096629935 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -52.77049207145819, + 213.5266977787108 + ], + [ + -40.98989083312517, + 333.28550289040726 + ] + ] + }, + { + "type": "arrow", + "version": 862, + "versionNonce": 240497827, + "isDeleted": false, + "id": "wT0WIuYwXK9qJaJbdcCZC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 502.18588894383083, + "y": 405.5301706503234, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 10.897504678678956, + "height": 137.49192545589256, + "seed": 1097920421, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323294435, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZvmnqZNJc9EgAXmWaosEK", + "focus": 0.11552311874670006, + "gap": 7.537983150323328 + }, + "endBinding": { + "elementId": "cuhfmFofLnkXv7e6B6frL", + "focus": -0.2904145603107151, + "gap": 12.30967309967673 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -10.897504678678956, + 137.49192545589256 + ] + ] + }, + { + "type": "rectangle", + "version": 198, + "versionNonce": 1587877443, + "isDeleted": false, + "id": "PjV1T-aVal-O9M1bWSnHt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 549.8509848204694, + "y": 468.1896019526268, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 107.90234375, + "height": 60, + "seed": 1022741893, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "8WcD_O-LpU-RAcn5iSEbV" + }, + { + "id": "0c2QxpluQRDQYeIoOqeQ8", + "type": "arrow" + }, + { + "id": "5TjKVv9EWolhxDOo0FOtP", + "type": "arrow" + }, + { + "id": "rMULHXDE5-aPl8XX1HpiF", + "type": "arrow" + }, + { + "id": "WkYhnsevmXLh2XqowRPZx", + "type": "arrow" + } + ], + "updated": 1693323268825, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 149, + "versionNonce": 733108675, + "isDeleted": false, + "id": "8WcD_O-LpU-RAcn5iSEbV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 566.0091879454694, + "y": 475.1896019526268, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 75.5859375, + "height": 46, + "seed": 1248103755, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323250981, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "an error \noccurs", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "PjV1T-aVal-O9M1bWSnHt", + "originalText": "an error occurs", + "lineHeight": 1.15, + "baseline": 42 + }, + { + "type": "rectangle", + "version": 223, + "versionNonce": 1052011181, + "isDeleted": false, + "id": "rM7jCr5aR4SHEFYIlN8cy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 735.3088360229422, + "y": 485.9675585524932, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 201, + "height": 46, + "seed": 1239186315, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "11_pUdLMmE8tXvaDM7Juc" + }, + { + "id": "0c2QxpluQRDQYeIoOqeQ8", + "type": "arrow" + } + ], + "updated": 1693323291564, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 211, + "versionNonce": 85893795, + "isDeleted": false, + "id": "11_pUdLMmE8tXvaDM7Juc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 740.3088360229422, + "y": 499.76755855249314, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 163.625, + "height": 18.4, + "seed": 500437605, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323291564, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "Interrupted: string error", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "rM7jCr5aR4SHEFYIlN8cy", + "originalText": "Interrupted: string error", + "lineHeight": 1.15, + "baseline": 15 + }, + { + "type": "arrow", + "version": 593, + "versionNonce": 1528321603, + "isDeleted": false, + "id": "0c2QxpluQRDQYeIoOqeQ8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 660.5775473204694, + "y": 502.1463532508906, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 63.93281899779993, + "height": 8.847597802710993, + "seed": 407387397, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323291564, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PjV1T-aVal-O9M1bWSnHt", + "focus": -0.10928341680618532, + "gap": 2.82421875 + }, + "endBinding": { + "elementId": "rM7jCr5aR4SHEFYIlN8cy", + "focus": -0.47222365654962584, + "gap": 10.798469704672812 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 63.93281899779993, + 8.847597802710993 + ] + ] + }, + { + "type": "rectangle", + "version": 372, + "versionNonce": 1421216333, + "isDeleted": false, + "id": "cuhfmFofLnkXv7e6B6frL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 426.54333754341405, + "y": 555.3317692058927, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 173, + "height": 85, + "seed": 402021, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "uHnEVWA05ARKVWKeYFR4X" + }, + { + "id": "wT0WIuYwXK9qJaJbdcCZC", + "type": "arrow" + }, + { + "id": "3VdXQBfzi-sxK4qZXtwHA", + "type": "arrow" + }, + { + "id": "5TjKVv9EWolhxDOo0FOtP", + "type": "arrow" + }, + { + "id": "1IKMEYtMW6iV8e47xxpUh", + "type": "arrow" + }, + { + "id": "g57-8kI6Tx2dqbk17t8WB", + "type": "arrow" + } + ], + "updated": 1693323294434, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 480, + "versionNonce": 20991235, + "isDeleted": false, + "id": "uHnEVWA05ARKVWKeYFR4X", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 432.98962660591405, + "y": 574.8317692058927, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 160.107421875, + "height": 46, + "seed": 1933358597, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323294434, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Scanning reaches\n chain tip", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "cuhfmFofLnkXv7e6B6frL", + "originalText": "Scanning reaches chain tip", + "lineHeight": 1.15, + "baseline": 42 + }, + { + "type": "arrow", + "version": 662, + "versionNonce": 261957699, + "isDeleted": false, + "id": "3VdXQBfzi-sxK4qZXtwHA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 606.871462543414, + "y": 608.5031917728453, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 94.12180678440996, + "height": 7.795856229389301, + "seed": 587078571, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323294435, + "link": null, + "locked": false, + "startBinding": { + "elementId": "cuhfmFofLnkXv7e6B6frL", + "gap": 7.328125, + "focus": 0.36937968830832907 + }, + "endBinding": { + "elementId": "GouMOOaqys858htk8Em2w", + "gap": 1.21484375, + "focus": 0.5087553000652315 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 94.12180678440996, + -7.795856229389301 + ] + ] + }, + { + "type": "rectangle", + "version": 303, + "versionNonce": 1542562787, + "isDeleted": false, + "id": "GouMOOaqys858htk8Em2w", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 702.208113077824, + "y": 554.0675712078972, + "strokeColor": "#1e1e1e", + "backgroundColor": "#fffefe", + "width": 380, + "height": 158, + "seed": 214722923, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "H-CDqq8nfnf7JdUhzfd05" + }, + { + "id": "3VdXQBfzi-sxK4qZXtwHA", + "type": "arrow" + } + ], + "updated": 1693323292615, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 460, + "versionNonce": 1347764173, + "isDeleted": false, + "id": "H-CDqq8nfnf7JdUhzfd05", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 707.208113077824, + "y": 559.4675712078972, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 284.6328125, + "height": 147.2, + "seed": 420596171, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323292615, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "Streaming:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp,\n last_evaluation: timestamp\n}", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "GouMOOaqys858htk8Em2w", + "originalText": "Streaming:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp,\n last_evaluation: timestamp\n}", + "lineHeight": 1.15, + "baseline": 143 + }, + { + "type": "arrow", + "version": 628, + "versionNonce": 1257580515, + "isDeleted": false, + "id": "5TjKVv9EWolhxDOo0FOtP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 563.9355095175913, + "y": 551.1796545141408, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 21.70734913495869, + "height": 19.99645646469287, + "seed": 1956554859, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323294435, + "link": null, + "locked": false, + "startBinding": { + "elementId": "cuhfmFofLnkXv7e6B6frL", + "focus": -0.0005490411077573741, + "gap": 4.152114691751876 + }, + "endBinding": { + "elementId": "PjV1T-aVal-O9M1bWSnHt", + "focus": -0.20408736108212475, + "gap": 2.9935960968210793 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 21.70734913495869, + -19.99645646469287 + ] + ] + }, + { + "type": "rectangle", + "version": 607, + "versionNonce": 773623669, + "isDeleted": false, + "id": "VJVw8FzuCprLKb3d5rkg7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 427.92077188945586, + "y": 698.4218140201257, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 196, + "height": 109, + "seed": 369499083, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "sbI2nD8phu5m6TgLXK3Hn" + }, + { + "id": "06estKp-6kQgwxO2t6KFG", + "type": "arrow" + }, + { + "id": "rMULHXDE5-aPl8XX1HpiF", + "type": "arrow" + }, + { + "id": "1IKMEYtMW6iV8e47xxpUh", + "type": "arrow" + }, + { + "id": "djLZxg7-dQzazao679PIu", + "type": "arrow" + }, + { + "id": "AI2OtMRbHFAQsydSNQb9y", + "type": "arrow" + }, + { + "id": "dPq75c13Wt7-UY0z2ZlUX", + "type": "arrow" + }, + { + "id": "KvsZXMShlfH_2BOhg46qy", + "type": "arrow" + } + ], + "updated": 1694622859986, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1013, + "versionNonce": 1575463309, + "isDeleted": false, + "id": "sbI2nD8phu5m6TgLXK3Hn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 440.88170938945586, + "y": 718.4218140201257, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 170.078125, + "height": 69, + "seed": 1711696491, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1693323298384, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Scanning or \nstreaming reaches \n\"end_block\" ", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VJVw8FzuCprLKb3d5rkg7", + "originalText": "Scanning or streaming reaches \"end_block\" ", + "lineHeight": 1.15, + "baseline": 65 + }, + { + "type": "rectangle", + "version": 443, + "versionNonce": 1725637197, + "isDeleted": false, + "id": "v8XemaV8aJ9l--tdjufTD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 711.6753975882452, + "y": 734.9948541984346, + "strokeColor": "#1e1e1e", + "backgroundColor": "#fffefe", + "width": 325, + "height": 155, + "seed": 523773989, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "oMSttaMhU_wKGGAHXk_id" + }, + { + "id": "06estKp-6kQgwxO2t6KFG", + "type": "arrow" + } + ], + "updated": 1693323296449, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 581, + "versionNonce": 682379323, + "isDeleted": false, + "id": "oMSttaMhU_wKGGAHXk_id", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 716.6753975882452, + "y": 748.0948541984346, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 284.6328125, + "height": 128.79999999999998, + "seed": 1755962245, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1694622802753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "ExpiredUnconfirmed:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "v8XemaV8aJ9l--tdjufTD", + "originalText": "ExpiredUnconfirmed:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "lineHeight": 1.15, + "baseline": 125 + }, + { + "type": "arrow", + "version": 1136, + "versionNonce": 1941237741, + "isDeleted": false, + "id": "06estKp-6kQgwxO2t6KFG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 626.5613968894559, + "y": 770.3360832644444, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 80.82493819878937, + "height": 8.000145116694966, + "seed": 1044084779, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323298385, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "gap": 2.640625, + "focus": 0.10172512118319793 + }, + "endBinding": { + "elementId": "v8XemaV8aJ9l--tdjufTD", + "gap": 4.2890625, + "focus": 0.1885960285484996 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 80.82493819878937, + 8.000145116694966 + ] + ] + }, + { + "type": "arrow", + "version": 577, + "versionNonce": 38015331, + "isDeleted": false, + "id": "rMULHXDE5-aPl8XX1HpiF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 616.5597720892812, + "y": 693.9391277225493, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 6.774993717848588, + "height": 156.8105767747229, + "seed": 1662498571, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323298385, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "gap": 4.482686297576379, + "focus": 0.4705886791648863 + }, + "endBinding": { + "elementId": "PjV1T-aVal-O9M1bWSnHt", + "focus": -0.11921475427335945, + "gap": 8.93894899519944 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 2.339646886887863, + -4.447393347200659 + ], + [ + -4.435346830960725, + -156.8105767747229 + ] + ] + }, + { + "type": "arrow", + "version": 665, + "versionNonce": 1461841155, + "isDeleted": false, + "id": "1IKMEYtMW6iV8e47xxpUh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 511.8992995910817, + "y": 651.6471881312585, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 4.936153623101745, + "height": 42.33736553126937, + "seed": 584409253, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323298385, + "link": null, + "locked": false, + "startBinding": { + "elementId": "cuhfmFofLnkXv7e6B6frL", + "gap": 11.315418925365861, + "focus": 0.07620959491265597 + }, + "endBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "gap": 4.437260357597779, + "focus": -0.02121397528307976 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 4.936153623101745, + 42.33736553126937 + ] + ] + }, + { + "type": "rectangle", + "version": 831, + "versionNonce": 1114522747, + "isDeleted": false, + "id": "QFC4ZYVbNfa9mBV9mRzba", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 390.78225569843585, + "y": 1008.7176721301067, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 196, + "height": 109, + "seed": 318026947, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "bjF0emENn5CCcCN01MRab" + }, + { + "id": "AI2OtMRbHFAQsydSNQb9y", + "type": "arrow" + }, + { + "id": "KvsZXMShlfH_2BOhg46qy", + "type": "arrow" + }, + { + "id": "g57-8kI6Tx2dqbk17t8WB", + "type": "arrow" + } + ], + "updated": 1694622809464, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1245, + "versionNonce": 516291867, + "isDeleted": false, + "id": "bjF0emENn5CCcCN01MRab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 461.54592757343585, + "y": 1051.7176721301066, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 54.47265625, + "height": 23, + "seed": 78062691, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1694622809464, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "Reorg", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "QFC4ZYVbNfa9mBV9mRzba", + "originalText": "Reorg", + "lineHeight": 1.15, + "baseline": 19 + }, + { + "type": "arrow", + "version": 478, + "versionNonce": 1670999509, + "isDeleted": false, + "id": "AI2OtMRbHFAQsydSNQb9y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 414.421285151069, + "y": 1005.0299520619433, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 23.009228451167758, + "height": 199.37867487825895, + "seed": 1595966755, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1694622874029, + "link": null, + "locked": false, + "startBinding": { + "elementId": "QFC4ZYVbNfa9mBV9mRzba", + "focus": -0.6597163319224459, + "gap": 3.687720068163401 + }, + "endBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "focus": 0.7675854498548031, + "gap": 1.9927953926588202 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -11.502537105439728, + -111.53573918643804 + ], + [ + 11.50669134572803, + -199.37867487825895 + ] + ] + }, + { + "type": "arrow", + "version": 1133, + "versionNonce": 1677632725, + "isDeleted": false, + "id": "KvsZXMShlfH_2BOhg46qy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 444.71562375340613, + "y": 809.7039836076483, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 21.935401940051293, + "height": 196.29494448998514, + "seed": 640396717, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1694622885264, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "focus": 0.6206873428350862, + "gap": 2.282169587522617 + }, + "endBinding": { + "elementId": "QFC4ZYVbNfa9mBV9mRzba", + "focus": -0.41444467780518385, + "gap": 2.7187440324732393 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -21.935401940051293, + 97.53554194371304 + ], + [ + -7.894879904453546, + 196.29494448998514 + ] + ] + }, + { + "type": "arrow", + "version": 710, + "versionNonce": 762124187, + "isDeleted": false, + "id": "g57-8kI6Tx2dqbk17t8WB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 404.70901517425114, + "y": 1007.7176721301066, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 84.18863410793688, + "height": 360.68468353730907, + "seed": 1246228803, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1694622809464, + "link": null, + "locked": false, + "startBinding": { + "elementId": "QFC4ZYVbNfa9mBV9mRzba", + "focus": -0.5378213678267441, + "gap": 1 + }, + "endBinding": { + "elementId": "cuhfmFofLnkXv7e6B6frL", + "focus": 0.5837090881973133, + "gap": 6.7012193869048815 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -56.1934924337628, + -151.93928882820387 + ], + [ + 27.99514167417408, + -360.68468353730907 + ] + ] + }, + { + "type": "arrow", + "version": 126, + "versionNonce": 445686637, + "isDeleted": false, + "id": "WkYhnsevmXLh2XqowRPZx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 563.5594198689771, + "y": 401.85717673144467, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 14.25196204286408, + "height": 60.58308263581745, + "seed": 950922723, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1693323268829, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZvmnqZNJc9EgAXmWaosEK", + "focus": -0.6230017385259247, + "gap": 3.8649892314446674 + }, + "endBinding": { + "elementId": "PjV1T-aVal-O9M1bWSnHt", + "focus": -0.28817041786904013, + "gap": 5.749342585364701 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.25196204286408, + 60.58308263581745 + ] + ] + }, + { + "type": "rectangle", + "version": 720, + "versionNonce": 613937909, + "isDeleted": false, + "id": "6evQPs114K99wYslVA3lc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 469.0322503573975, + "y": 856.7813382617101, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 196, + "height": 109, + "seed": 1851342139, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "qstuPvboSd5cDgDO2crr8" + }, + { + "id": "dPq75c13Wt7-UY0z2ZlUX", + "type": "arrow" + }, + { + "id": "-DLh1Hquji1zA-aPPWB68", + "type": "arrow" + } + ], + "updated": 1694622852486, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1152, + "versionNonce": 1017418427, + "isDeleted": false, + "id": "qstuPvboSd5cDgDO2crr8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 501.5635003573975, + "y": 888.2813382617101, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 130.9375, + "height": 46, + "seed": 743693787, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1694622825027, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 2, + "text": "\"end_block\" is \nconfirmed", + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6evQPs114K99wYslVA3lc", + "originalText": "\"end_block\" is confirmed", + "lineHeight": 1.15, + "baseline": 42 + }, + { + "id": "dPq75c13Wt7-UY0z2ZlUX", + "type": "arrow", + "x": 548.9557224304908, + "y": 812.1542895512052, + "width": 4.149587198984591, + "height": 42.60450633807136, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 1420309461, + "version": 68, + "versionNonce": 497034715, + "isDeleted": false, + "boundElements": null, + "updated": 1694622835426, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 4.149587198984591, + 42.60450633807136 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VJVw8FzuCprLKb3d5rkg7", + "focus": -0.16712940342499136, + "gap": 4.732475531079558 + }, + "endBinding": { + "elementId": "6evQPs114K99wYslVA3lc", + "focus": -0.08152081048962034, + "gap": 2.0225423724334632 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "rectangle", + "version": 546, + "versionNonce": 1370847669, + "isDeleted": false, + "id": "WEx7Gt9m-vnKB2WzyjWmh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 709.4556719342766, + "y": 923.9101941297819, + "strokeColor": "#1e1e1e", + "backgroundColor": "#fffefe", + "width": 325, + "height": 155, + "seed": 834510197, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 3 + }, + "boundElements": [ + { + "type": "text", + "id": "YWpk3RazRnr8Q68Id41Wm" + }, + { + "id": "-DLh1Hquji1zA-aPPWB68", + "type": "arrow" + } + ], + "updated": 1694622852486, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 688, + "versionNonce": 51897557, + "isDeleted": false, + "id": "YWpk3RazRnr8Q68Id41Wm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 714.4556719342766, + "y": 937.0101941297819, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "width": 284.6328125, + "height": 128.79999999999998, + "seed": 997467861, + "groupIds": [], + "frameId": null, + "roundness": null, + "boundElements": [], + "updated": 1694622845413, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 2, + "text": "ExpiredConfirmed:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "textAlign": "left", + "verticalAlign": "middle", + "containerId": "WEx7Gt9m-vnKB2WzyjWmh", + "originalText": "ExpiredConfirmed:\n{\n number_of_times_triggered: number,\n number_of_blocks_evaluated: number,\n last_evaluated_block_height: number,\n last_occurrence: timestamp\n}", + "lineHeight": 1.15, + "baseline": 125 + }, + { + "id": "-DLh1Hquji1zA-aPPWB68", + "type": "arrow", + "x": 667.1655294401883, + "y": 948.8546927383518, + "width": 35.36053812696866, + "height": 24.220766483342913, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": { + "type": 2 + }, + "seed": 788113307, + "version": 145, + "versionNonce": 1876812667, + "isDeleted": false, + "boundElements": null, + "updated": 1694622855694, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 35.36053812696866, + 24.220766483342913 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "6evQPs114K99wYslVA3lc", + "focus": -0.2549978383729463, + "gap": 2.13327908279075 + }, + "endBinding": { + "elementId": "WEx7Gt9m-vnKB2WzyjWmh", + "focus": -0.46459503844075406, + "gap": 6.929604367119623 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png b/docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..e37e2400651a4707963f457b31db8c94d1af1586 GIT binary patch literal 512548 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

{KlcYbVowS3ri-(-s+=`$E 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�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�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 N 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࡮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 e|B- Date: Thu, 14 Sep 2023 13:03:22 -0400 Subject: [PATCH 51/99] ci: fix release ci by adding .releaserc (#414) --- .releaserc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .releaserc diff --git a/.releaserc b/.releaserc new file mode 100644 index 000000000..7a1113cf0 --- /dev/null +++ b/.releaserc @@ -0,0 +1,22 @@ +{ + "branches": [ + "main" + ], + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits" + } + ], + [ + "@semantic-release/release-notes-generator", + { + "preset": "conventionalcommits" + } + ], + "@semantic-release/github", + "@semantic-release/changelog", + "@semantic-release/git" + ] +} From 1868a06aba6de61bfb516b0f88b3e900a5d99a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Cha=C3=ADn?= Date: Fri, 15 Sep 2023 20:23:06 +0200 Subject: [PATCH 52/99] fix: prevent panic when scanning from genesis block (#408) Parent block height (`u64`) is always set to `block - 1` which will result on a panic when trying to construct genesis parent's block height. Co-authored-by: Ludo Galabru --- .../chainhook-sdk/src/indexer/bitcoin/mod.rs | 5 ++++- .../chainhook-sdk/src/indexer/stacks/mod.rs | 5 ++++- .../indexer/tests/helpers/bitcoin_blocks.rs | 15 +++++++++++---- .../src/indexer/tests/helpers/stacks_blocks.rs | 18 ++++++++++++------ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index 3bdf00718..cc209ec63 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -548,7 +548,10 @@ pub fn standardize_bitcoin_block( .previousblockhash .unwrap_or(BlockHash::all_zeros().to_string()) ), - index: block_height - 1, + index: match block_height { + 0 => 0, + _ => block_height - 1, + }, }, timestamp: block.time as u32, metadata: BitcoinBlockMetadata { diff --git a/components/chainhook-sdk/src/indexer/stacks/mod.rs b/components/chainhook-sdk/src/indexer/stacks/mod.rs index 388594aeb..01f3318ae 100644 --- a/components/chainhook-sdk/src/indexer/stacks/mod.rs +++ b/components/chainhook-sdk/src/indexer/stacks/mod.rs @@ -336,7 +336,10 @@ pub fn standardize_stacks_block( }, parent_block_identifier: BlockIdentifier { hash: block.parent_index_block_hash.clone(), - index: block.block_height - 1, + index: match block.block_height { + 0 => 0, + _ => block.block_height - 1, + } }, timestamp: block.parent_burn_block_timestamp, metadata: StacksBlockMetadata { diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/bitcoin_blocks.rs b/components/chainhook-sdk/src/indexer/tests/helpers/bitcoin_blocks.rs index 37e31276c..268ce421d 100644 --- a/components/chainhook-sdk/src/indexer/tests/helpers/bitcoin_blocks.rs +++ b/components/chainhook-sdk/src/indexer/tests/helpers/bitcoin_blocks.rs @@ -11,13 +11,19 @@ pub fn generate_test_bitcoin_block( let mut hash = vec![ fork_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; + + let parent_height = match block_height { + 0 => 0, + _ => block_height - 1, + }; + let parent_block_identifier = match parent { Some(parent) => { - assert_eq!(parent.block_identifier.index, block_height - 1); + assert_eq!(parent.block_identifier.index, parent_height); parent.block_identifier.clone() } _ => { - let mut parent_hash = if (block_height - 1) == 1 { + let mut parent_hash = if parent_height == 1 { vec![ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] @@ -26,9 +32,10 @@ pub fn generate_test_bitcoin_block( fork_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] }; - parent_hash.append(&mut (block_height - 1).to_be_bytes().to_vec()); + + parent_hash.append(&mut parent_height.to_be_bytes().to_vec()); BlockIdentifier { - index: block_height - 1, + index: parent_height, hash: format!("0x{}", hex::encode(&parent_hash[..])), } } diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/stacks_blocks.rs b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_blocks.rs index 29b0f7d88..39d39dd72 100644 --- a/components/chainhook-sdk/src/indexer/tests/helpers/stacks_blocks.rs +++ b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_blocks.rs @@ -12,15 +12,21 @@ pub fn generate_test_stacks_block( let mut hash = vec![ fork_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; + + let parent_height = match block_height { + 0 => 0, + _ => block_height - 1, + }; + let (parent_block_identifier, confirm_microblock_identifier) = match parent { Some(BlockEvent::Block(parent)) => { - assert_eq!(parent.block_identifier.index, block_height - 1); + assert_eq!(parent.block_identifier.index, parent_height); (parent.block_identifier.clone(), None) } Some(BlockEvent::Microblock(microblock_parent)) => { assert_eq!( microblock_parent.metadata.anchor_block_identifier.index, - block_height - 1 + parent_height, ); ( microblock_parent.metadata.anchor_block_identifier.clone(), @@ -28,7 +34,7 @@ pub fn generate_test_stacks_block( ) } _ => { - let mut parent_hash = if (block_height - 1) == 1 { + let mut parent_hash = if parent_height == 1 { vec![ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] @@ -37,10 +43,10 @@ pub fn generate_test_stacks_block( fork_id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ] }; - parent_hash.append(&mut (block_height - 1).to_be_bytes().to_vec()); + parent_hash.append(&mut parent_height.to_be_bytes().to_vec()); ( BlockIdentifier { - index: block_height - 1, + index: parent_height, hash: hex::encode(&parent_hash[..]), }, None, @@ -58,7 +64,7 @@ pub fn generate_test_stacks_block( transactions, metadata: StacksBlockMetadata { bitcoin_anchor_block_identifier: BlockIdentifier { - index: block_height - 1, + index: parent_height, hash: format!(""), }, pox_cycle_index: 1, From c6ca1ba4aa8880e0effb000e4f78b1fff0f3d0c0 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 18 Sep 2023 11:54:02 -0400 Subject: [PATCH 53/99] test: add tests for `GET /v1/chainhooks/` route (#415) ### Description Add tests for chainhook service, fix a few things along the way. --- ### Checklist - [X] All tests pass - [X] Tests added in this PR (if applicable) Test coverage before: 37.72% Test coverage after: 47.07% --- .github/workflows/ci.yaml | 5 +- components/chainhook-cli/Cargo.toml | 1 + components/chainhook-cli/src/scan/bitcoin.rs | 14 +- components/chainhook-cli/src/service/mod.rs | 47 +- .../src/service/tests/helpers.rs | 70 -- .../service/tests/helpers/build_predicates.rs | 71 ++ .../service/tests/helpers/mock_bitcoin_rpc.rs | 184 ++++ .../src/service/tests/helpers/mock_service.rs | 389 +++++++++ .../service/tests/helpers/mock_stacks_node.rs | 173 ++++ .../src/service/tests/helpers/mod.rs | 24 + .../chainhook-cli/src/service/tests/mod.rs | 801 ++++++++++-------- .../src/chainhooks/bitcoin/mod.rs | 6 +- .../src/chainhooks/stacks/mod.rs | 2 +- .../chainhook-sdk/src/chainhooks/types.rs | 4 +- .../chainhook-sdk/src/indexer/bitcoin/mod.rs | 9 +- .../src/indexer/fork_scratch_pad.rs | 4 +- .../src/indexer/stacks/blocks_pool.rs | 7 +- 17 files changed, 1338 insertions(+), 473 deletions(-) delete mode 100644 components/chainhook-cli/src/service/tests/helpers.rs create mode 100644 components/chainhook-cli/src/service/tests/helpers/build_predicates.rs create mode 100644 components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs create mode 100644 components/chainhook-cli/src/service/tests/helpers/mock_service.rs create mode 100644 components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs create mode 100644 components/chainhook-cli/src/service/tests/helpers/mod.rs diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f0a1012bf..c9a5b4a65 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,10 +22,13 @@ jobs: fetch-depth: 0 persist-credentials: false + - name: Install redis + run: sudo apt-get install -y redis-server + - name: Cargo test run: | rustup update - RUST_BACKTRACE=1 cargo test --all -- --test-threads=1 + RUST_BACKTRACE=1 cargo test --all --features redis_tests -- --test-threads=1 - name: Semantic Release uses: cycjimmy/semantic-release-action@v3 diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 596c9ec98..0179c2da0 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -58,6 +58,7 @@ default = ["cli"] cli = ["clap", "clap_generate", "toml", "ctrlc", "hiro-system-kit/log"] debug = ["hiro-system-kit/debug"] release = ["hiro-system-kit/release"] +redis_tests = [] # [patch.crates-io] # raft-proto = { git = "https://github.com/tikv/raft-rs", rev="95c532612ee6a83591fce9a8b51d6afe87b58835"} diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index b6cd43e1e..4224104b3 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -1,7 +1,7 @@ use crate::config::{Config, PredicatesApi}; use crate::service::{ - open_readwrite_predicates_db_conn_or_panic, set_predicate_scanning_status, - set_unconfirmed_expiration_status, ScanningData, + open_readwrite_predicates_db_conn_or_panic, set_confirmed_expiration_status, + set_predicate_scanning_status, set_unconfirmed_expiration_status, ScanningData, }; use chainhook_sdk::bitcoincore_rpc::RpcApi; use chainhook_sdk::bitcoincore_rpc::{Auth, Client}; @@ -14,6 +14,7 @@ use chainhook_sdk::indexer; use chainhook_sdk::indexer::bitcoin::{ build_http_client, download_and_parse_block_with_retry, retrieve_block_hash_with_retry, }; +use chainhook_sdk::indexer::fork_scratch_pad::CONFIRMED_SEGMENT_MINIMUM_LENGTH; use chainhook_sdk::observer::{gather_proofs, EventObserverConfig}; use chainhook_sdk::types::{ BitcoinBlockData, BitcoinChainEvent, BitcoinChainUpdatedWithBlocksData, BlockIdentifier, Chain, @@ -41,6 +42,9 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( let mut floating_end_block = false; let mut block_heights_to_scan = if let Some(ref blocks) = predicate_spec.blocks { + // todo: if a user provides a number of blocks where start_block + blocks > chain tip, + // the predicate will fail to scan all blocks. we should calculate a valid end_block and + // switch to streaming mode at some point BlockHeights::Blocks(blocks.clone()).get_sorted_entries() } else { let start_block = match predicate_spec.start_block { @@ -107,7 +111,7 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( None => (number_of_blocks_to_scan, 0, 0u64), } }; - + let mut last_scanned_block_confirmations = 0; let http_client = build_http_client(); while let Some(current_block_height) = block_heights_to_scan.pop_front() { @@ -123,6 +127,7 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( let block_breakdown = download_and_parse_block_with_retry(&http_client, &block_hash, &bitcoin_config, ctx) .await?; + last_scanned_block_confirmations = block_breakdown.confirmations; let block = match indexer::bitcoin::standardize_bitcoin_block( block_breakdown, &event_observer_config.bitcoin_network, @@ -226,6 +231,9 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( predicates_db_conn, ctx, ); + if last_scanned_block_confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH { + set_confirmed_expiration_status(&predicate_spec.key(), predicates_db_conn, ctx); + } return Ok(true); } } diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index e9b213e67..cc641b951 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -533,7 +533,7 @@ impl Service { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] /// A high-level view of how `PredicateStatus` is used/updated can be seen here: docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png. pub enum PredicateStatus { @@ -545,7 +545,7 @@ pub enum PredicateStatus { New, } -#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] pub struct ScanningData { pub number_of_blocks_to_scan: u64, pub number_of_blocks_evaluated: u64, @@ -554,7 +554,7 @@ pub struct ScanningData { pub last_evaluated_block_height: u64, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct StreamingData { pub last_occurrence: u128, pub last_evaluation: u128, @@ -563,7 +563,7 @@ pub struct StreamingData { pub last_evaluated_block_height: u64, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct ExpiredData { pub number_of_blocks_evaluated: u64, pub number_of_times_triggered: u64, @@ -844,6 +844,7 @@ pub fn set_unconfirmed_expiration_status( ctx: &Context, ) { let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); + let mut previously_was_unconfirmed = false; let ( number_of_blocks_evaluated, number_of_times_triggered, @@ -882,15 +883,22 @@ pub fn set_unconfirmed_expiration_status( last_occurrence, last_evaluated_block_height: _, expired_at_block_height, - }) => ( - number_of_blocks_evaluated + number_of_new_blocks_evaluated, - number_of_times_triggered, - last_occurrence, - expired_at_block_height, - ), - PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { + }) => { + previously_was_unconfirmed = true; + ( + number_of_blocks_evaluated + number_of_new_blocks_evaluated, + number_of_times_triggered, + last_occurrence, + expired_at_block_height, + ) + } + PredicateStatus::Interrupted(_) => { unreachable!("unreachable predicate status: {:?}", status) } + PredicateStatus::ConfirmedExpiration(_) => { + warn!(ctx.expect_logger(), "Attempting to set UnconfirmedExpiration status when ConfirmedExpiration status has already been set for predicate {}", predicate_key); + return; + } }, None => (0, 0, 0, 0), }; @@ -906,13 +914,16 @@ pub fn set_unconfirmed_expiration_status( predicates_db_conn, &ctx, ); - insert_predicate_expiration( - chain, - expired_at_block_height, - predicate_key, - predicates_db_conn, - &ctx, - ); + // don't insert this entry more than once + if !previously_was_unconfirmed { + insert_predicate_expiration( + chain, + expired_at_block_height, + predicate_key, + predicates_db_conn, + &ctx, + ); + } } pub fn set_confirmed_expiration_status( diff --git a/components/chainhook-cli/src/service/tests/helpers.rs b/components/chainhook-cli/src/service/tests/helpers.rs deleted file mode 100644 index d42b34788..000000000 --- a/components/chainhook-cli/src/service/tests/helpers.rs +++ /dev/null @@ -1,70 +0,0 @@ -use crate::scan::stacks::Record; -use crate::scan::stacks::RecordKind; -use chainhook_sdk::indexer::stacks::NewBlock; -use chainhook_sdk::indexer::stacks::NewTransaction; - -fn create_stacks_tsv_transaction(index: u64) -> NewTransaction { - NewTransaction { - txid: format!("transaction_id_{index}"), - tx_index: index as usize, - status: format!("success"), - raw_result: format!("0x0703"), - raw_tx: format!("0x00000000010400e2cd0871da5bdd38c4d5569493dc3b14aac4e0a10000000000000019000000000000000000008373b16e4a6f9d87864c314dd77bbd8b27a2b1805e96ec5a6509e7e4f833cd6a7bdb2462c95f6968a867ab6b0e8f0a6498e600dbc46cfe9f84c79709da7b9637010200000000040000000000000000000000000000000000000000000000000000000000000000"), - execution_cost: None, - } -} - -pub fn create_stacks_tsv_block(height: u64, burn_block_height: u64) -> NewBlock { - let parent_height = if height == 0 { 0 } else { height - 1 }; - let parent_burn_block_height = if burn_block_height == 0 { - 0 - } else { - burn_block_height - 1 - }; - - NewBlock { - block_height: height, - block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{height}"), - index_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{height}"), - burn_block_height: burn_block_height, - burn_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{burn_block_height}"), - parent_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_height}"), - parent_index_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_height}"), - parent_microblock: "0x0000000000000000000000000000000000000000000000000000000000000000" - .into(), - parent_microblock_sequence: 0, - parent_burn_block_hash: format!("0x000000000000000000000000000000000000000000000000000000000000000{parent_burn_block_height}"), - parent_burn_block_height: burn_block_height, - parent_burn_block_timestamp: 0, - transactions: (0..4).map(|i| create_stacks_tsv_transaction(i)).collect(), - events: vec![], - matured_miner_rewards: vec![], - } -} - -fn create_stacks_tsv_block_received_record(height: u64, burn_block_height: u64) -> Record { - let block = create_stacks_tsv_block(height, burn_block_height); - let serialized_block = serde_json::to_string(&block).unwrap(); - Record { - id: height, - created_at: height.to_string(), - kind: RecordKind::StacksBlockReceived, - blob: Some(serialized_block), - } -} -pub const WORKING_DIR: &str = "src/service/tests/fixtures/tmp"; -pub fn create_stacks_tsv_with_blocks(block_count: u64, dir: &str) { - let mut writer = csv::WriterBuilder::default() - .has_headers(false) - .delimiter(b'\t') - .double_quote(false) - .quote(b'\'') - .buffer_capacity(8 * (1 << 10)) - .from_path(dir) - .expect("unable to create csv writer"); - for i in 1..block_count + 1 { - writer - .serialize(create_stacks_tsv_block_received_record(i, i + 100)) - .unwrap(); - } -} diff --git a/components/chainhook-cli/src/service/tests/helpers/build_predicates.rs b/components/chainhook-cli/src/service/tests/helpers/build_predicates.rs new file mode 100644 index 000000000..110194867 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers/build_predicates.rs @@ -0,0 +1,71 @@ +use rocket::serde::json::Value as JsonValue; + +pub const DEFAULT_UUID: &str = "4ecc-4ecc-435b-9948-d5eeca1c3ce6"; + +pub fn get_random_uuid() -> String { + let mut rng = rand::thread_rng(); + let random_digit: u64 = rand::Rng::gen(&mut rng); + format!("test-uuid-{random_digit}") +} + +pub fn build_bitcoin_payload( + network: Option<&str>, + if_this: Option, + then_that: Option, + filter: Option, + uuid: Option<&str>, +) -> JsonValue { + let network = network.unwrap_or("mainnet"); + let if_this = if_this.unwrap_or(json!({"scope":"block"})); + let then_that = then_that.unwrap_or(json!("noop")); + let filter = filter.unwrap_or(json!({})); + + let filter = filter.as_object().unwrap(); + let mut network_val = json!({ + "if_this": if_this, + "then_that": then_that + }); + for (k, v) in filter.iter() { + network_val[k] = v.to_owned(); + } + json!({ + "chain": "bitcoin", + "uuid": uuid.unwrap_or(DEFAULT_UUID), + "name": "test", + "version": 1, + "networks": { + network: network_val + } + }) +} + +pub fn build_stacks_payload( + network: Option<&str>, + if_this: Option, + then_that: Option, + filter: Option, + uuid: Option<&str>, +) -> JsonValue { + let network = network.unwrap_or("mainnet"); + let if_this = if_this.unwrap_or(json!({"scope":"txid", "equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"})); + let then_that = then_that.unwrap_or(json!("noop")); + let filter = filter.unwrap_or(json!({})); + + let filter = filter.as_object().unwrap(); + let mut network_val = json!({ + "if_this": if_this, + "then_that": then_that + }); + for (k, v) in filter.iter() { + network_val[k] = v.to_owned(); + } + json!({ + "chain": "stacks", + "uuid": uuid.unwrap_or(DEFAULT_UUID), + "name": "test", + "version": 1, + "networks": { + network: network_val + } + }) +} diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs b/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs new file mode 100644 index 000000000..7760e6390 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs @@ -0,0 +1,184 @@ +use chainhook_sdk::bitcoincore_rpc_json::bitcoin::TxMerkleNode; +use rocket::serde::json::Value; +use std::cmp::max; +use std::collections::HashMap; +use std::net::IpAddr; +use std::net::Ipv4Addr; +use std::str::FromStr; +use std::sync::Arc; +use std::sync::RwLock; + +use chainhook_sdk::bitcoincore_rpc_json::bitcoin::hashes::sha256d::Hash; +use chainhook_sdk::bitcoincore_rpc_json::bitcoin::Amount; +use chainhook_sdk::bitcoincore_rpc_json::bitcoin::BlockHash; +use chainhook_sdk::bitcoincore_rpc_json::GetBlockResult; +use chainhook_sdk::bitcoincore_rpc_json::GetBlockchainInfoResult; +use chainhook_sdk::bitcoincore_rpc_json::GetNetworkInfoResult; +use rocket::serde::json::Json; +use rocket::Config; +use rocket::State; + +use super::height_to_hash_str; + +#[derive(Clone, Serialize, Deserialize, Debug)] +#[serde(crate = "rocket::serde")] +struct Rpc { + jsonrpc: String, + id: Value, + method: String, + params: Vec, +} + +fn height_to_hash(height: u64) -> BlockHash { + let hash = Hash::from_str(&height_to_hash_str(height)).unwrap(); + BlockHash::from_hash(hash) +} + +fn height_to_merkle_node(height: u64) -> TxMerkleNode { + let hash = Hash::from_str(&height_to_hash_str(height)).unwrap(); + TxMerkleNode::from_hash(hash) +} + +#[post("/increment-chain-tip")] +fn handle_increment_chain_tip(chain_tip: &State>>) -> Value { + let mut chain_tip = chain_tip.inner().write().unwrap(); + *chain_tip += 1; + json!(chain_tip.to_owned()) +} + +#[post("/", format = "application/json", data = "")] +fn handle_rpc(rpc: Json, chain_tip: &State>>) -> Value { + let rpc = rpc.into_inner(); + let chain_tip = *chain_tip.inner().read().unwrap(); + match rpc.method.as_str() { + "getblock" => { + let hash = rpc.params[0].as_str().unwrap(); + let prefix = hash.chars().take_while(|&ch| ch == '0').collect::(); + let height = hash.split(&prefix).collect::>()[1]; + let height = height.parse::().unwrap_or(0); + if height > chain_tip { + return json!({ + "id": rpc.id, + "jsonrpc": rpc.jsonrpc, + "error": format!("invalid request: requested block is above chain tip: height {}, chain tip: {}", height, chain_tip) + }); + } + let next_block_hash = if height == chain_tip { + None + } else { + Some(height_to_hash(height + 1)) + }; + let confirmations = max(0, chain_tip - height) as i32; + let previousblockhash = if height == 0 { + None + } else { + Some(height_to_hash(height - 1)) + }; + let block = GetBlockResult { + hash: BlockHash::from_hash(Hash::from_str(hash).unwrap()), + confirmations, + size: 0, + strippedsize: None, + weight: 0, + height: height as usize, + version: 19000, + version_hex: None, + merkleroot: height_to_merkle_node(height), + tx: vec![], + time: 0, + mediantime: None, + nonce: 0, + bits: "".to_string(), + difficulty: 0.0, + chainwork: vec![], + n_tx: 0, + previousblockhash, + nextblockhash: next_block_hash, + }; + json!({ + "id": rpc.id, + "jsonrpc": rpc.jsonrpc, + "result": serde_json::to_value(&block).unwrap() + }) + } + "getblockchaininfo" => { + let hash = format!("{:0>64}", chain_tip.to_string()); + let hash = Hash::from_str(&hash).unwrap(); + let blockchain_info = GetBlockchainInfoResult { + chain: "regtest".into(), + blocks: chain_tip.to_owned(), + headers: 0, + best_block_hash: BlockHash::from_hash(hash), + difficulty: 0.0, + median_time: 0, + verification_progress: 0.0, + initial_block_download: false, + chain_work: vec![], + size_on_disk: 0, + pruned: false, + prune_height: None, + automatic_pruning: None, + prune_target_size: None, + softforks: HashMap::new(), + warnings: "".into(), + }; + json!({ + "id": rpc.id, + "jsonrpc": rpc.jsonrpc, + "result": serde_json::to_value(&blockchain_info).unwrap() + }) + } + "getnetworkinfo" => { + let network_info = GetNetworkInfoResult { + version: 190000, + subversion: "".into(), + protocol_version: 0, + local_services: "".into(), + local_relay: false, + time_offset: 0, + connections: 0, + connections_in: None, + connections_out: None, + network_active: true, + networks: vec![], + relay_fee: Amount::ZERO, + incremental_fee: Amount::ZERO, + local_addresses: vec![], + warnings: "".into(), + }; + let value = serde_json::to_value(network_info).unwrap(); + json!({ + "id": rpc.id, + "jsonrpc": rpc.jsonrpc, + "result": value + }) + } + "getblockhash" => { + let height = rpc.params[0].as_u64().unwrap(); + let hash = format!("{:0>64}", height.to_string()); + let hash = Hash::from_str(&hash).unwrap(); + let hash = BlockHash::from_hash(hash); + json!({ + "id": serde_json::to_value(rpc.id).unwrap(), + "jsonrpc": rpc.jsonrpc, + "result": serde_json::to_value(hash).unwrap(), + }) + } + _ => unimplemented!("unsupported rpc endpoint"), + } +} + +pub async fn mock_bitcoin_rpc(port: u16, starting_chain_tip: u64) { + let config = Config::figment() + .merge(("port", port)) + .merge(("address", IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))) + .merge(("log_level", "off")); + let chain_tip_rw_lock = Arc::new(RwLock::new(starting_chain_tip)); + let _rocket = rocket::build() + .configure(config) + .manage(chain_tip_rw_lock) + .mount("/", routes![handle_rpc, handle_increment_chain_tip]) + .launch() + .await + .unwrap(); +} diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_service.rs b/components/chainhook-cli/src/service/tests/helpers/mock_service.rs new file mode 100644 index 000000000..608df7a90 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers/mock_service.rs @@ -0,0 +1,389 @@ +use crate::config::Config; +use crate::config::EventSourceConfig; +use crate::config::LimitsConfig; +use crate::config::PathConfig; +use crate::config::PredicatesApi; +use crate::config::PredicatesApiConfig; +use crate::config::StorageConfig; +use crate::config::DEFAULT_REDIS_URI; +use crate::service::http_api::start_predicate_api_server; +use crate::service::PredicateStatus; +use crate::service::Service; +use chainhook_sdk::indexer::IndexerConfig; +use chainhook_sdk::observer::ObserverCommand; +use chainhook_sdk::types::BitcoinBlockSignaling; +use chainhook_sdk::types::BitcoinNetwork; +use chainhook_sdk::types::Chain; +use chainhook_sdk::types::StacksNetwork; +use chainhook_sdk::types::StacksNodeConfig; +use chainhook_sdk::utils::Context; +use redis::Commands; +use rocket::serde::json::Value as JsonValue; +use rocket::Shutdown; +use std::path::PathBuf; +use std::process::Stdio; +use std::process::{Child, Command}; +use std::sync::mpsc::channel; +use std::sync::mpsc::Receiver; + +pub async fn get_predicate_status(uuid: &str, port: u16) -> Result { + let mut attempts = 0; + loop { + let res = call_get_predicate(uuid, port).await?; + match res.as_object() { + Some(res_obj) => match res_obj.get("result") { + Some(result) => match result.get("status") { + Some(status) => { + return serde_json::from_value(status.clone()) + .map_err(|e| format!("failed to parse status {}", e.to_string())); + } + None => return Err(format!("no status field on get predicate result")), + }, + None => { + attempts += 1; + println!("reattempting get predicate status"); + if attempts == 10 { + return Err(format!("no result field on get predicate response")); + } else { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + } + } + }, + None => return Err(format!("failed to parse get predicate response")), + } + } +} + +pub async fn filter_predicate_status_from_all_predicates( + uuid: &str, + port: u16, +) -> Result { + let mut attempts = 0; + loop { + let res = call_get_predicates(port).await?; + match res.as_object() { + Some(res_obj) => match res_obj.get("result") { + Some(result) => match result.as_array() { + Some(predicate_array) => { + let matching_predicate = + predicate_array.iter().find(|p| match p.as_object() { + Some(p) => match p.get("uuid") { + Some(predicate_uuid) => predicate_uuid == uuid, + None => false, + }, + None => false, + }); + match matching_predicate { + Some(predicate) => match predicate.get("status") { + Some(status) => { + return serde_json::from_value(status.clone()).map_err(|e| { + format!("failed to parse status {}", e.to_string()) + }); + } + None => { + return Err(format!( + "no status field on matching get predicates result" + )) + } + }, + None => { + return Err(format!( + "could not find predicate result with uuid matching {uuid}" + )); + } + } + } + None => { + return Err(format!( + "failed to parse get predicate response's result field" + )) + } + }, + None => { + attempts += 1; + println!("reattempting get predicates"); + if attempts == 10 { + return Err(format!("no result field on get predicates response")); + } else { + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + } + } + }, + None => return Err(format!("failed to parse get predicate response")), + } + } +} + +pub async fn call_register_predicate( + predicate: &JsonValue, + port: u16, +) -> Result { + let client = reqwest::Client::new(); + let res =client + .post(format!("http://localhost:{port}/v1/chainhooks")) + .header("Content-Type", "application/json") + .json(predicate) + .send() + .await + .map_err(|e| { + format!( + "Failed to make POST request to localhost:{port}/v1/chainhooks: {}", + e + ) + })? + .json::() + .await + .map_err(|e| { + format!( + "Failed to deserialize response of POST request to localhost:{port}/v1/chainhooks: {}", + e + ) + })?; + Ok(res) +} + +pub async fn call_deregister_predicate( + chain: &Chain, + predicate_uuid: &str, + port: u16, +) -> Result { + let client = reqwest::Client::new(); + let chain = match chain { + Chain::Bitcoin => "bitcoin", + Chain::Stacks => "stacks", + }; + let url = format!("http://localhost:{port}/v1/chainhooks/{chain}/{predicate_uuid}"); + let res = client + .delete(&url) + .header("Content-Type", "application/json") + .send() + .await + .map_err(|e| format!("Failed to make DELETE request to {url}: {}", e))? + .json::() + .await + .map_err(|e| { + format!( + "Failed to deserialize response of DELETE request to {url}: {}", + e + ) + })?; + Ok(res) +} + +pub async fn call_get_predicate(predicate_uuid: &str, port: u16) -> Result { + let client = reqwest::Client::new(); + let res =client + .get(format!("http://localhost:{port}/v1/chainhooks/{predicate_uuid}")) + .send() + .await + .map_err(|e| { + format!( + "Failed to make GET request to localhost:8765/v1/chainhooks/<{predicate_uuid}>: {}", + e + ) + })? + .json::() + .await + .map_err(|e| { + format!( + "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks/{predicate_uuid}: {}", + e + ) + })?; + Ok(res) +} + +pub async fn call_get_predicates(port: u16) -> Result { + let client = reqwest::Client::new(); + let res =client + .get(format!("http://localhost:{port}/v1/chainhooks")) + .send() + .await + .map_err(|e| { + format!( + "Failed to make GET request to localhost:8765/v1/chainhooks: {}", + e + ) + })? + .json::() + .await + .map_err(|e| { + format!( + "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks: {}", + e + ) + })?; + Ok(res) +} + +pub async fn build_predicate_api_server(port: u16) -> (Receiver, Shutdown) { + let ctx = Context { + logger: None, + tracer: false, + }; + let api_config = PredicatesApiConfig { + http_port: port, + display_logs: true, + database_uri: DEFAULT_REDIS_URI.to_string(), + }; + + let (tx, rx) = channel(); + let shutdown = start_predicate_api_server(api_config, tx, ctx) + .await + .unwrap(); + + // Loop to check if the server is ready + let mut attempts = 0; + const MAX_ATTEMPTS: u32 = 10; + loop { + if attempts >= MAX_ATTEMPTS { + panic!("failed to start server"); + } + + if let Ok(_client) = reqwest::Client::new() + .get(format!("http://localhost:{}/ping", port)) + .send() + .await + { + break; // Server is ready + } + + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + attempts += 1; + } + (rx, shutdown) +} + +pub async fn start_redis(port: u16) -> Result { + let handle = Command::new("redis-server") + .arg(format!("--port {port}")) + .stdout(Stdio::null()) + .spawn() + .map_err(|e| format!("failed to create start-redis command: {}", e.to_string()))?; + let mut attempts = 0; + loop { + match redis::Client::open(format!("redis://localhost:{port}/")) { + Ok(client) => match client.get_connection() { + Ok(_) => return Ok(handle), + Err(e) => { + attempts += 1; + if attempts == 10 { + return Err(format!("failed to start redis service: {}", e.to_string())); + } + tokio::time::sleep(std::time::Duration::from_secs(1)).await + } + }, + Err(e) => { + attempts += 1; + if attempts == 10 { + return Err(format!("failed to start redis service: {}", e.to_string())); + } + tokio::time::sleep(std::time::Duration::from_secs(1)).await + } + } + } +} + +pub fn flush_redis(port: u16) { + let client = redis::Client::open(format!("redis://localhost:{port}/")) + .expect("unable to connect to redis"); + let mut predicate_db_conn = client.get_connection().expect("unable to connect to redis"); + let predicate_keys: Vec = predicate_db_conn + .scan_match("predicate:*") + .unwrap() + .into_iter() + .collect(); + for k in predicate_keys { + predicate_db_conn + .hdel::<_, _, ()>(&k, "predicates") + .unwrap(); + predicate_db_conn.hdel::<_, _, ()>(&k, "status").unwrap(); + predicate_db_conn + .hdel::<_, _, ()>(&k, "specification") + .unwrap(); + } +} + +pub fn get_chainhook_config( + redis_port: u16, + chainhook_port: u16, + stacks_rpc_port: u16, + stacks_ingestion_port: u16, + bitcoin_rpc_port: u16, + working_dir: &str, + tsv_dir: &str, +) -> Config { + let api_config = PredicatesApiConfig { + http_port: chainhook_port, + display_logs: true, + database_uri: format!("redis://localhost:{redis_port}/"), + }; + Config { + http_api: PredicatesApi::On(api_config), + storage: StorageConfig { + working_dir: working_dir.into(), + }, + event_sources: vec![EventSourceConfig::StacksTsvPath(PathConfig { + file_path: PathBuf::from(tsv_dir), + })], + limits: LimitsConfig { + max_number_of_bitcoin_predicates: 100, + max_number_of_concurrent_bitcoin_scans: 100, + max_number_of_stacks_predicates: 10, + max_number_of_concurrent_stacks_scans: 10, + max_number_of_processing_threads: 16, + max_number_of_networking_threads: 16, + max_caching_memory_size_mb: 32000, + }, + network: IndexerConfig { + bitcoin_network: BitcoinNetwork::Regtest, + stacks_network: StacksNetwork::Devnet, + bitcoind_rpc_username: "".into(), + bitcoind_rpc_password: "".into(), + bitcoind_rpc_url: format!("http://0.0.0.0:{bitcoin_rpc_port}"), + bitcoin_block_signaling: BitcoinBlockSignaling::Stacks(StacksNodeConfig { + rpc_url: format!("http://localhost:{stacks_rpc_port}"), + ingestion_port: stacks_ingestion_port, + }), + }, + } +} +pub async fn start_chainhook_service( + config: Config, + chainhook_port: u16, + ctx: &Context, +) -> Result<(), String> { + let mut service = Service::new(config, ctx.clone()); + let startup_predicates = vec![]; + let _ = hiro_system_kit::thread_named("Stacks service") + .spawn(move || { + let future = service.run(startup_predicates); + let _ = hiro_system_kit::nestable_block_on(future); + }) + .map_err(|e| { + format!( + "failed to start chainhook service thread, {}", + e.to_string() + ) + })?; + + // Loop to check if the server is ready + let mut attempts = 0; + const MAX_ATTEMPTS: u32 = 10; + loop { + if attempts >= MAX_ATTEMPTS { + return Err(format!("failed to ping chainhook service")); + } + + if let Ok(_client) = reqwest::Client::new() + .get(format!("http://localhost:{}/ping", chainhook_port)) + .send() + .await + { + break Ok(()); // Server is ready + } + + tokio::time::sleep(std::time::Duration::from_secs(1)).await; + attempts += 1; + } +} diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs new file mode 100644 index 000000000..f591522e6 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs @@ -0,0 +1,173 @@ +use crate::scan::stacks::{Record, RecordKind}; +use chainhook_sdk::indexer::bitcoin::NewBitcoinBlock; +use chainhook_sdk::indexer::stacks::{NewBlock, NewTransaction}; + +use super::height_to_prefixed_hash; + +pub const TEST_WORKING_DIR: &str = "src/service/tests/fixtures/tmp"; + +pub fn create_tmp_working_dir() -> Result<(String, String), String> { + let mut rng = rand::thread_rng(); + let random_digit: u64 = rand::Rng::gen(&mut rng); + let working_dir = format!("{TEST_WORKING_DIR}/{random_digit}"); + let tsv_dir = format!("./{working_dir}/stacks_blocks.tsv"); + std::fs::create_dir_all(&working_dir) + .map_err(|e| format!("failed to create temp working dir: {}", e.to_string()))?; + Ok((working_dir, tsv_dir)) +} + +fn create_stacks_new_transaction(index: u64) -> NewTransaction { + NewTransaction { + txid: format!("transaction_id_{index}"), + tx_index: index as usize, + status: format!("success"), + raw_result: format!("0x0703"), + raw_tx: format!("0x00000000010400e2cd0871da5bdd38c4d5569493dc3b14aac4e0a10000000000000019000000000000000000008373b16e4a6f9d87864c314dd77bbd8b27a2b1805e96ec5a6509e7e4f833cd6a7bdb2462c95f6968a867ab6b0e8f0a6498e600dbc46cfe9f84c79709da7b9637010200000000040000000000000000000000000000000000000000000000000000000000000000"), + execution_cost: None, + } +} + +pub fn create_stacks_new_block(height: u64, burn_block_height: u64) -> NewBlock { + let parent_height = if height == 0 { 0 } else { height - 1 }; + let parent_burn_block_height = if burn_block_height == 0 { + 0 + } else { + burn_block_height - 1 + }; + + NewBlock { + block_height: height, + block_hash: height_to_prefixed_hash(height), + index_block_hash: height_to_prefixed_hash(height), + burn_block_height: burn_block_height, + burn_block_hash: height_to_prefixed_hash(burn_block_height), + parent_block_hash: height_to_prefixed_hash(parent_height), + parent_index_block_hash: height_to_prefixed_hash(parent_height), + parent_microblock: "0x0000000000000000000000000000000000000000000000000000000000000000" + .into(), + parent_microblock_sequence: 0, + parent_burn_block_hash: height_to_prefixed_hash(parent_burn_block_height), + parent_burn_block_height: burn_block_height, + parent_burn_block_timestamp: 0, + transactions: (0..4).map(|i| create_stacks_new_transaction(i)).collect(), + events: vec![], + matured_miner_rewards: vec![], + } +} + +fn create_stacks_block_received_record( + height: u64, + burn_block_height: u64, +) -> Result { + let block = create_stacks_new_block(height, burn_block_height); + let serialized_block = serde_json::to_string(&block) + .map_err(|e| format!("failed to serialize stacks block: {}", e.to_string()))?; + Ok(Record { + id: height, + created_at: height.to_string(), + kind: RecordKind::StacksBlockReceived, + blob: Some(serialized_block), + }) +} +pub fn write_stacks_blocks_to_tsv(block_count: u64, dir: &str) -> Result<(), String> { + let mut writer = csv::WriterBuilder::default() + .has_headers(false) + .delimiter(b'\t') + .double_quote(false) + .quote(b'\'') + .buffer_capacity(8 * (1 << 10)) + .from_path(dir) + .expect("unable to create csv writer"); + for i in 1..block_count + 1 { + writer + .serialize(create_stacks_block_received_record(i, i + 100)?) + .map_err(|e| format!("failed to write tsv file: {}", e.to_string()))?; + } + Ok(()) +} + +pub async fn mine_stacks_block( + port: u16, + height: u64, + burn_block_height: u64, +) -> Result<(), String> { + let block = create_stacks_new_block(height, burn_block_height); + let serialized_block = serde_json::to_string(&block).unwrap(); + let client = reqwest::Client::new(); + let _res = client + .post(format!("http://localhost:{port}/new_block")) + .header("content-type", "application/json") + .body(serialized_block) + .send() + .await + .map_err(|e| format!("failed to send new_block request: {}", e.to_string()))? + .text() + .await + .map_err(|e| { + format!( + "failed to parse response for new_block request: {}", + e.to_string() + ) + })?; + Ok(()) +} + +fn create_new_burn_block(burn_block_height: u64) -> NewBitcoinBlock { + NewBitcoinBlock { + burn_block_hash: height_to_prefixed_hash(burn_block_height), + burn_block_height, + reward_recipients: vec![], + reward_slot_holders: vec![], + burn_amount: 0, + } +} + +pub async fn mine_burn_block( + stacks_ingestion_port: u16, + bitcoin_rpc_port: u16, + burn_block_height: u64, +) -> Result<(), String> { + let block = create_new_burn_block(burn_block_height); + let serialized_block = serde_json::to_string(&block) + .map_err(|e| format!("failed to serialize burn block: {}", e.to_string()))?; + let client = reqwest::Client::new(); + let res = client + .post(format!( + "http://localhost:{bitcoin_rpc_port}/increment-chain-tip" + )) + .send() + .await + .map_err(|e| { + format!( + "mock bitcoin rpc endpoint increment-chain-tip failed: {}", + e.to_string() + ) + })? + .text() + .await + .map_err(|e| { + format!( + "failed to parse response for mock bitcoin rpc increment-chain-tip endpoint: {}", + e.to_string() + ) + })?; + assert_eq!(burn_block_height.to_string(), res); + let _res = client + .post(format!( + "http://localhost:{stacks_ingestion_port}/new_burn_block" + )) + .header("content-type", "application/json") + .body(serialized_block) + .send() + .await + .map_err(|e| format!("failed to send new_burn_block request: {}", e.to_string()))? + .text() + .await + .map_err(|e| { + format!( + "failed to parse response for new_burn_block request: {}", + e.to_string() + ) + })?; + Ok(()) +} diff --git a/components/chainhook-cli/src/service/tests/helpers/mod.rs b/components/chainhook-cli/src/service/tests/helpers/mod.rs new file mode 100644 index 000000000..8f78b5084 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/helpers/mod.rs @@ -0,0 +1,24 @@ +use std::net::TcpListener; + +pub mod build_predicates; +pub mod mock_bitcoin_rpc; +pub mod mock_service; +pub mod mock_stacks_node; + +pub fn height_to_prefixed_hash(height: u64) -> String { + format!("0x{}", height_to_hash_str(height)) +} +fn height_to_hash_str(height: u64) -> String { + format!("{:0>64}", height.to_string()) +} + +pub fn get_free_port() -> Result { + let listener = TcpListener::bind("127.0.0.1:0") + .map_err(|e| format!("Failed to bind to port 0: {}", e.to_string()))?; + let port = listener + .local_addr() + .map_err(|e| format!("failed to parse address: {}", e.to_string()))? + .port(); + drop(listener); + Ok(port) +} diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index a142ce304..747c99210 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -1,192 +1,35 @@ -use chainhook_sdk::indexer::stacks::NewBlock; -use chainhook_sdk::indexer::IndexerConfig; -use chainhook_sdk::types::BitcoinBlockSignaling; -use chainhook_sdk::types::BitcoinNetwork; use chainhook_sdk::types::Chain; -use chainhook_sdk::types::StacksNetwork; -use chainhook_sdk::types::StacksNodeConfig; -use redis::Commands; +use chainhook_sdk::utils::Context; use rocket::serde::json::Value as JsonValue; use rocket::Shutdown; use std::net::TcpListener; -use std::path::PathBuf; -use std::sync::mpsc::Receiver; +use std::process::Child; use std::thread::sleep; use std::time::Duration; use test_case::test_case; use chainhook_sdk::observer::ObserverCommand; -use crate::config::Config; -use crate::config::EventSourceConfig; -use crate::config::LimitsConfig; -use crate::config::PathConfig; -use crate::config::PredicatesApi; -use crate::config::PredicatesApiConfig; -use crate::config::StorageConfig; -use crate::config::DEFAULT_REDIS_URI; +use self::helpers::build_predicates::{build_bitcoin_payload, build_stacks_payload, DEFAULT_UUID}; +use self::helpers::mock_bitcoin_rpc::mock_bitcoin_rpc; +use self::helpers::mock_service::{ + call_deregister_predicate, filter_predicate_status_from_all_predicates, flush_redis, + start_chainhook_service, start_redis, +}; +use self::helpers::mock_stacks_node::{ + create_tmp_working_dir, mine_burn_block, mine_stacks_block, write_stacks_blocks_to_tsv, +}; use crate::scan::stacks::consolidate_local_stacks_chainstate_using_csv; +use crate::service::tests::helpers::build_predicates::get_random_uuid; +use crate::service::tests::helpers::get_free_port; +use crate::service::tests::helpers::mock_service::{ + build_predicate_api_server, call_get_predicate, call_register_predicate, get_chainhook_config, + get_predicate_status, +}; use crate::service::PredicateStatus; -use crate::service::Service; - -use self::helpers::{create_stacks_tsv_block, create_stacks_tsv_with_blocks, WORKING_DIR}; - -use super::channel; -use super::http_api::start_predicate_api_server; -use super::Context; mod helpers; -const UUID: &str = "4ecc-4ecc-435b-9948-d5eeca1c3ce6"; - -fn build_bitcoin_payload( - network: Option<&str>, - if_this: Option, - then_that: Option, - filter: Option, - uuid: Option<&str>, -) -> JsonValue { - let network = network.unwrap_or("mainnet"); - let if_this = if_this.unwrap_or(json!({"scope":"block"})); - let then_that = then_that.unwrap_or(json!("noop")); - let filter = filter.unwrap_or(json!({})); - - let filter = filter.as_object().unwrap(); - let mut network_val = json!({ - "if_this": if_this, - "then_that": then_that - }); - for (k, v) in filter.iter() { - network_val[k] = v.to_owned(); - } - json!({ - "chain": "bitcoin", - "uuid": uuid.unwrap_or(UUID), - "name": "test", - "version": 1, - "networks": { - network: network_val - } - }) -} - -fn build_stacks_payload( - network: Option<&str>, - if_this: Option, - then_that: Option, - filter: Option, - uuid: Option<&str>, -) -> JsonValue { - let network = network.unwrap_or("mainnet"); - let if_this = if_this.unwrap_or(json!({"scope":"txid", "equals": "0xfaaac1833dc4883e7ec28f61e35b41f896c395f8d288b1a177155de2abd6052f"})); - let then_that = then_that.unwrap_or(json!("noop")); - let filter = filter.unwrap_or(json!({})); - - let filter = filter.as_object().unwrap(); - let mut network_val = json!({ - "if_this": if_this, - "then_that": then_that - }); - for (k, v) in filter.iter() { - network_val[k] = v.to_owned(); - } - json!({ - "chain": "stacks", - "uuid": uuid.unwrap_or(UUID), - "name": "test", - "version": 1, - "networks": { - network: network_val - } - }) -} - -async fn build_service(port: u16) -> (Receiver, Shutdown) { - let ctx = Context { - logger: None, - tracer: false, - }; - let api_config = PredicatesApiConfig { - http_port: port, - display_logs: true, - database_uri: DEFAULT_REDIS_URI.to_string(), - }; - - let (tx, rx) = channel(); - let shutdown = start_predicate_api_server(api_config, tx, ctx) - .await - .unwrap(); - - // Loop to check if the server is ready - let mut attempts = 0; - const MAX_ATTEMPTS: u32 = 10; - loop { - if attempts >= MAX_ATTEMPTS { - panic!("failed to start server"); - } - - if let Ok(_client) = reqwest::Client::new() - .get(format!("http://localhost:{}/ping", port)) - .send() - .await - { - break; // Server is ready - } - - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - attempts += 1; - } - (rx, shutdown) -} - -async fn call_register_predicate(predicate: &JsonValue, port: u16) -> Result { - let client = reqwest::Client::new(); - let res =client - .post(format!("http://localhost:{port}/v1/chainhooks")) - .header("Content-Type", "application/json") - .json(predicate) - .send() - .await - .map_err(|e| { - format!( - "Failed to make POST request to localhost:8765/v1/chainhooks: {}", - e - ) - })? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of POST request to localhost:{port}/v1/chainhooks: {}", - e - ) - })?; - Ok(res) -} - -async fn call_get_predicate(predicate_uuid: &str, port: u16) -> Result { - let client = reqwest::Client::new(); - let res =client - .get(format!("http://localhost:{port}/v1/chainhooks/{predicate_uuid}")) - .send() - .await - .map_err(|e| { - format!( - "Failed to make POST request to localhost:8765/v1/chainhooks: {}", - e - ) - })? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks: {}", - e - ) - })?; - Ok(res) -} - async fn test_register_predicate(predicate: JsonValue) -> Result<(), (String, Shutdown)> { // perhaps a little janky, we bind to the port 0 to find an open one, then // drop the listener to free up that port @@ -194,7 +37,7 @@ async fn test_register_predicate(predicate: JsonValue) -> Result<(), (String, Sh let port = listener.local_addr().unwrap().port(); drop(listener); - let (rx, shutdown) = build_service(port).await; + let (rx, shutdown) = build_predicate_api_server(port).await; let moved_shutdown = shutdown.clone(); let res = call_register_predicate(&predicate, port) @@ -241,7 +84,7 @@ async fn test_register_predicate(predicate: JsonValue) -> Result<(), (String, Sh shutdown.notify(); assert_eq!(registered_predicate, predicate); assert_eq!(status, String::from("200")); - assert_eq!(result, format!("\"{UUID}\"")); + assert_eq!(result, format!("\"{DEFAULT_UUID}\"")); Ok(()) } @@ -407,137 +250,6 @@ async fn it_handles_stacks_predicates_with_filters(filters: JsonValue) { } } } -fn flush_redis() { - let client = - redis::Client::open("redis://localhost:6378/").expect("unable to connect to redis"); - let mut predicate_db_conn = client.get_connection().expect("unable to connect to redis"); - let predicate_keys: Vec = predicate_db_conn - .scan_match("predicate:*") - .unwrap() - .into_iter() - .collect(); - for k in predicate_keys { - predicate_db_conn - .hdel::<_, _, ()>(&k, "predicates") - .unwrap(); - predicate_db_conn.hdel::<_, _, ()>(&k, "status").unwrap(); - predicate_db_conn - .hdel::<_, _, ()>(&k, "specification") - .unwrap(); - } -} -async fn start_chainhook_service( - chainhook_port: u16, - stacks_rpc_port: u16, - stacks_ingestion_port: u16, - working_dir: &str, - tsv_dir: &str, -) { - flush_redis(); - let logger = hiro_system_kit::log::setup_logger(); - let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); - let ctx = Context { - logger: Some(logger), - tracer: false, - }; - let api_config = PredicatesApiConfig { - http_port: chainhook_port, - display_logs: true, - database_uri: "redis://localhost:6378/".to_string(), - }; - let mut config = Config { - http_api: PredicatesApi::On(api_config), - storage: StorageConfig { - working_dir: working_dir.into(), - }, - event_sources: vec![EventSourceConfig::StacksTsvPath(PathConfig { - file_path: PathBuf::from(tsv_dir), - })], - limits: LimitsConfig { - max_number_of_bitcoin_predicates: 100, - max_number_of_concurrent_bitcoin_scans: 100, - max_number_of_stacks_predicates: 10, - max_number_of_concurrent_stacks_scans: 10, - max_number_of_processing_threads: 16, - max_number_of_networking_threads: 16, - max_caching_memory_size_mb: 32000, - }, - network: IndexerConfig { - bitcoin_network: BitcoinNetwork::Regtest, - stacks_network: StacksNetwork::Devnet, - bitcoind_rpc_username: "user".into(), - bitcoind_rpc_password: "user".into(), - bitcoind_rpc_url: "http://localhost:18443".into(), - bitcoin_block_signaling: BitcoinBlockSignaling::Stacks(StacksNodeConfig { - rpc_url: format!("http://localhost:{stacks_rpc_port}"), - ingestion_port: stacks_ingestion_port, - }), - }, - }; - // delete current database - consolidate_local_stacks_chainstate_using_csv(&mut config, &ctx) - .await - .unwrap(); - let mut service = Service::new(config, ctx); - let startup_predicates = vec![]; - let _ = hiro_system_kit::thread_named("Stacks service") - .spawn(move || { - let future = service.run(startup_predicates); - let _ = hiro_system_kit::nestable_block_on(future); - }) - .expect("unable to spawn thread"); - - // Loop to check if the server is ready - let mut attempts = 0; - const MAX_ATTEMPTS: u32 = 10; - loop { - if attempts >= MAX_ATTEMPTS { - panic!("failed to start server"); - } - - if let Ok(_client) = reqwest::Client::new() - .get(format!("http://localhost:{}/ping", chainhook_port)) - .send() - .await - { - break; // Server is ready - } - - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - attempts += 1; - } -} - -fn get_random_uuid() -> String { - let mut rng = rand::thread_rng(); - let random_digit: u64 = rand::Rng::gen(&mut rng); - format!("test-uuid-{random_digit}") -} - -fn get_random_dirs() -> (String, String) { - let mut rng = rand::thread_rng(); - let random_digit: u64 = rand::Rng::gen(&mut rng); - let working_dir = format!("{WORKING_DIR}/{random_digit}"); - let tsv_dir = format!("./{working_dir}/stacks_blocks.tsv"); - std::fs::create_dir_all(&working_dir).unwrap(); - (working_dir, tsv_dir) -} - -async fn get_predicate_status(uuid: &str, port: u16) -> PredicateStatus { - let res = call_get_predicate(uuid, port).await.unwrap(); - let res = res.as_object().unwrap(); - let res = res.get("result").unwrap(); - let status: PredicateStatus = - serde_json::from_value(res.get("status").unwrap().clone()).unwrap(); - status -} - -fn get_free_port() -> u16 { - let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to port 0"); - let port = listener.local_addr().unwrap().port(); - drop(listener); - port -} fn assert_confirmed_expiration_status(status: PredicateStatus) { match status { @@ -559,89 +271,442 @@ fn assert_streaming_status(status: PredicateStatus) { } } -async fn mine_stacks_block(port: u16, height: u64, burn_block_height: u64) { - let block = create_stacks_tsv_block(height, burn_block_height); - let serialized_block = serde_json::to_string(&block).unwrap(); - let _block_again: NewBlock = serde_json::from_str(&serialized_block).unwrap(); - let client = reqwest::Client::new(); - let _res = client - .post(format!("http://localhost:{port}/new_block")) - .header("content-type", "application/json") - .body(serialized_block) - .send() +fn assert_interrupted_status(status: PredicateStatus) { + match status { + PredicateStatus::Interrupted(_) => {} + _ => panic!("expected Interrupted status, found {:?}", status), + } +} + +fn setup_chainhook_service_ports() -> Result<(u16, u16, u16, u16, u16), String> { + let redis_port = get_free_port()?; + let chainhook_service_port = get_free_port()?; + let stacks_rpc_port = get_free_port()?; + let stacks_ingestion_port = get_free_port()?; + let bitcoin_rpc_port = get_free_port()?; + Ok(( + redis_port, + chainhook_service_port, + stacks_rpc_port, + stacks_ingestion_port, + bitcoin_rpc_port, + )) +} + +async fn await_new_scanning_status_complete( + uuid: &str, + chainhook_service_port: u16, +) -> Result<(), String> { + let mut attempts = 0; + loop { + match get_predicate_status(uuid, chainhook_service_port).await? { + PredicateStatus::New | PredicateStatus::Scanning(_) => { + attempts += 1; + if attempts == 10 { + return Err(format!("predicate stuck in new/scanning status")); + } + sleep(Duration::new(1, 0)); + } + _ => break Ok(()), + } + } +} + +async fn setup_stacks_chainhook_test( + starting_chain_tip: u64, +) -> (Child, String, u16, u16, u16, u16) { + let ( + redis_port, + chainhook_service_port, + stacks_rpc_port, + stacks_ingestion_port, + bitcoin_rpc_port, + ) = setup_chainhook_service_ports().unwrap_or_else(|e| panic!("test failed with error: {e}")); + + let mut redis_process = start_redis(redis_port) .await - .unwrap() - .text() + .unwrap_or_else(|e| panic!("test failed with error: {e}")); + + let (working_dir, tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let logger = hiro_system_kit::log::setup_logger(); + let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); + let ctx = Context { + logger: Some(logger), + tracer: false, + }; + + write_stacks_blocks_to_tsv(starting_chain_tip, &tsv_dir).unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let mut config = get_chainhook_config( + redis_port, + chainhook_service_port, + stacks_rpc_port, + stacks_ingestion_port, + bitcoin_rpc_port, + &working_dir, + &tsv_dir, + ); + + consolidate_local_stacks_chainstate_using_csv(&mut config, &ctx) .await - .unwrap(); + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + start_chainhook_service(config, chainhook_service_port, &ctx) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + ( + redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + bitcoin_rpc_port, + ) } -#[test_case(Chain::Stacks, 5, 0, Some(3) => ignore using assert_confirmed_expiration_status; "scanning to predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status for Stacks chain")] -#[test_case(Chain::Stacks, 5, 0, None => ignore using assert_streaming_status; "scanning with no predicate_end_block ends with Streaming status for Stacks chain")] -#[test_case(Chain::Stacks, 3, 0, Some(5) => ignore using assert_streaming_status; "scanning to predicate_end_block greater than chain_tip ends with Streaming status for Stacks chain")] -#[test_case(Chain::Stacks, 5, 3, Some(7) => ignore using assert_unconfirmed_expiration_status; "scanning with predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status for Stacks chain")] -#[test_case(Chain::Bitcoin, 5, 0, Some(3) => ignore using assert_confirmed_expiration_status; "scanning to predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status for Bitcoin chain")] +#[test_case(5, 0, Some(1), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status")] +#[test_case(5, 0, Some(1), None => using assert_streaming_status; "no predicate_end_block ends with Streaming status")] +#[test_case(3, 0, Some(1), Some(5) => using assert_streaming_status; "predicate_end_block greater than chain_tip ends with Streaming status")] +#[test_case(5, 3, Some(1), Some(7) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status")] +#[test_case(0, 0, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] #[tokio::test] -//#[serial_test::serial] -async fn predicate_status_is_updated( - chain: Chain, +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn test_stacks_predicate_status_is_updated( starting_chain_tip: u64, blocks_to_mine: u64, + predicate_start_block: Option, predicate_end_block: Option, ) -> PredicateStatus { - let chainhook_service_port = get_free_port(); - let stacks_rpc_port = get_free_port(); - let stacks_ingestion_port = get_free_port(); - let (working_dir, tsv_dir) = get_random_dirs(); + let ( + mut redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + _, + ) = setup_stacks_chainhook_test(starting_chain_tip).await; + let uuid = &get_random_uuid(); - let predicate = match chain { - Chain::Stacks => { - create_stacks_tsv_with_blocks(starting_chain_tip, &tsv_dir); - build_stacks_payload( - Some("devnet"), - Some(json!({"scope":"block_height", "lower_than": 100})), - None, - Some(json!({"start_block": 1, "end_block": predicate_end_block})), - Some(uuid), - ) - } - Chain::Bitcoin => build_bitcoin_payload( - Some("regtest"), - Some(json!({"scope":"block"})), - None, - Some(json!({"start_block": 1, "end_block": predicate_end_block})), - Some(uuid), - ), + let predicate = build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": predicate_start_block, "end_block": predicate_end_block})), + Some(uuid), + ); + let _ = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + await_new_scanning_status_complete(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + for i in 1..blocks_to_mine + 1 { + mine_stacks_block( + stacks_ingestion_port, + i + starting_chain_tip, + i + starting_chain_tip + 100, + ) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + } + sleep(Duration::new(2, 0)); + let result = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let found_predicate_status = + filter_predicate_status_from_all_predicates(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_eq!(found_predicate_status, result); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + result +} + +async fn setup_bitcoin_chainhook_test( + starting_chain_tip: u64, +) -> (Child, String, u16, u16, u16, u16) { + let ( + redis_port, + chainhook_service_port, + stacks_rpc_port, + stacks_ingestion_port, + bitcoin_rpc_port, + ) = setup_chainhook_service_ports().unwrap_or_else(|e| panic!("test failed with error: {e}")); + + let mut redis_process = start_redis(redis_port) + .await + .unwrap_or_else(|e| panic!("test failed with error: {e}")); + + let (working_dir, tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let logger = hiro_system_kit::log::setup_logger(); + let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); + let ctx = Context { + logger: Some(logger), + tracer: false, }; - start_chainhook_service( + + let _ = hiro_system_kit::thread_named("Bitcoin rpc service") + .spawn(move || { + let future = mock_bitcoin_rpc(bitcoin_rpc_port, starting_chain_tip); + let _ = hiro_system_kit::nestable_block_on(future); + }) + .expect("unable to spawn thread"); + + let config = get_chainhook_config( + redis_port, chainhook_service_port, stacks_rpc_port, stacks_ingestion_port, + bitcoin_rpc_port, &working_dir, &tsv_dir, + ); + + start_chainhook_service(config, chainhook_service_port, &ctx) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + ( + redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + bitcoin_rpc_port, ) - .await; - let res = call_register_predicate(&predicate, chainhook_service_port) +} + +#[test_case(5, 1, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(10, 1, Some(1), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] +#[test_case(1, 3, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(3, 7, Some(1), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] +#[test_case(0, 0, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn test_bitcoin_predicate_status_is_updated( + starting_chain_tip: u64, + blocks_to_mine: u64, + predicate_start_block: Option, + predicate_end_block: Option, +) -> PredicateStatus { + let ( + mut redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + bitcoin_rpc_port, + ) = setup_bitcoin_chainhook_test(starting_chain_tip).await; + + let uuid = &get_random_uuid(); + let predicate = build_bitcoin_payload( + Some("regtest"), + Some(json!({"scope":"block"})), + None, + Some(json!({"start_block": predicate_start_block, "end_block": predicate_end_block})), + Some(uuid), + ); + + let _ = call_register_predicate(&predicate, chainhook_service_port) .await - .unwrap(); - let res = res.as_object().unwrap(); - let status = res.get("status").unwrap(); - assert_eq!(status, &json!(200)); - - match get_predicate_status(uuid, chainhook_service_port).await { - PredicateStatus::New => {} - _ => panic!("initially registered predicate should have new status"), - } - for i in 0..blocks_to_mine { - mine_stacks_block( + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + await_new_scanning_status_complete(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + for i in 1..blocks_to_mine + 1 { + mine_burn_block( stacks_ingestion_port, + bitcoin_rpc_port, i + starting_chain_tip, - i + starting_chain_tip + 100, ) - .await; + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); } sleep(Duration::new(2, 0)); - let result = get_predicate_status(uuid, chainhook_service_port).await; - std::fs::remove_dir_all(working_dir).unwrap(); + let result = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + let found_predicate_status = + filter_predicate_status_from_all_predicates(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_eq!(found_predicate_status, result); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); result } + +#[test_case(Chain::Stacks; "for stacks chain")] +#[test_case(Chain::Bitcoin; "for bitcoin chain")] +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn test_deregister_predicate(chain: Chain) { + let (mut redis_process, working_dir, chainhook_service_port, redis_port, _, _) = match &chain { + Chain::Stacks => setup_stacks_chainhook_test(0).await, + Chain::Bitcoin => setup_bitcoin_chainhook_test(0).await, + }; + + let uuid = &get_random_uuid(); + + let predicate = match &chain { + Chain::Stacks => build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": 1, "end_block": 2})), + Some(uuid), + ), + Chain::Bitcoin => build_bitcoin_payload( + Some("regtest"), + Some(json!({"scope":"block"})), + None, + Some(json!({"start_block": 1, "end_block": 2})), + Some(uuid), + ), + }; + + let _ = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let result = call_get_predicate(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_eq!(result.get("status"), Some(&json!(200))); + + let result = call_deregister_predicate(&chain, uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_eq!(result.get("status"), Some(&json!(200))); + + let mut attempts = 0; + loop { + let result = call_get_predicate(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + if result.get("status") == Some(&json!(404)) { + break; + } else if attempts == 3 { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("predicate was not successfully derigistered"); + } else { + attempts += 1; + sleep(Duration::new(1, 0)); + } + } + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); +} diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index f6ce4a596..d4b411e17 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -74,7 +74,7 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( for block in event.new_blocks.iter() { evaluated_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); - if end_block > block.block_identifier.index { + if end_block >= block.block_identifier.index { let mut hits = vec![]; for tx in block.transactions.iter() { if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { @@ -105,7 +105,7 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( let end_block = chainhook.end_block.unwrap_or(u64::MAX); for block in event.blocks_to_rollback.iter() { - if end_block > block.block_identifier.index { + if end_block >= block.block_identifier.index { let mut hits = vec![]; for tx in block.transactions.iter() { if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { @@ -121,7 +121,7 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>( } for block in event.blocks_to_apply.iter() { evaluated_predicates.insert(chainhook.uuid.as_str(), &block.block_identifier); - if end_block > block.block_identifier.index { + if end_block >= block.block_identifier.index { let mut hits = vec![]; for tx in block.transactions.iter() { if chainhook.predicate.evaluate_transaction_predicate(&tx, ctx) { diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index d4ba4a808..766c4cf4f 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -270,7 +270,7 @@ pub fn evaluate_stacks_chainhook_on_blocks<'a>( let mut expired_predicates = BTreeMap::new(); let end_block = chainhook.end_block.unwrap_or(u64::MAX); for block in blocks { - if end_block > block.get_identifier().index { + if end_block >= block.get_identifier().index { let mut hits = vec![]; if chainhook.is_predicate_targeting_block_header() && evaluate_stacks_predicate_on_block(block, chainhook, ctx) diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 44f73f471..463615520 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -134,7 +134,7 @@ impl ChainhookConfig { pub fn expire_stacks_hook(&mut self, hook_uuid: String, block_height: u64) { let mut i = 0; while i < self.stacks_chainhooks.len() { - if self.stacks_chainhooks[i].uuid == hook_uuid { + if ChainhookSpecification::stacks_key(&self.stacks_chainhooks[i].uuid) == hook_uuid { self.stacks_chainhooks[i].expired_at = Some(block_height); break; } else { @@ -146,7 +146,7 @@ impl ChainhookConfig { pub fn expire_bitcoin_hook(&mut self, hook_uuid: String, block_height: u64) { let mut i = 0; while i < self.bitcoin_chainhooks.len() { - if self.bitcoin_chainhooks[i].uuid == hook_uuid { + if ChainhookSpecification::bitcoin_key(&self.bitcoin_chainhooks[i].uuid) == hook_uuid { self.bitcoin_chainhooks[i].expired_at = Some(block_height); break; } else { diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index cc209ec63..573babf1b 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -21,6 +21,8 @@ use rand::{thread_rng, Rng}; use reqwest::Client as HttpClient; use serde::Deserialize; +use super::fork_scratch_pad::CONFIRMED_SEGMENT_MINIMUM_LENGTH; + #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct BitcoinBlockFullBreakdown { @@ -30,6 +32,7 @@ pub struct BitcoinBlockFullBreakdown { pub time: usize, pub nonce: u32, pub previousblockhash: Option, + pub confirmations: i32, } impl BitcoinBlockFullBreakdown { @@ -114,7 +117,7 @@ pub struct BitcoinTransactionOutputFullBreakdown { pub script_pub_key: GetRawTransactionResultVoutScriptPubKey, } -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] pub struct NewBitcoinBlock { pub burn_block_hash: String, pub burn_block_height: u64, @@ -124,7 +127,7 @@ pub struct NewBitcoinBlock { } #[allow(dead_code)] -#[derive(Deserialize)] +#[derive(Deserialize, Serialize)] pub struct RewardParticipant { recipient: String, amt: u64, @@ -575,7 +578,7 @@ fn try_parse_stacks_operation( // Safely parsing the first 2 bytes (following OP_RETURN + PUSH_DATA) let op_return_output = &outputs[0].script_pub_key.hex; - if op_return_output.len() < 7 { + if op_return_output.len() < CONFIRMED_SEGMENT_MINIMUM_LENGTH as usize { return None; } if op_return_output[3] != expected_magic_bytes[0] diff --git a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs index ca32bba7c..251913a06 100644 --- a/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs +++ b/components/chainhook-sdk/src/indexer/fork_scratch_pad.rs @@ -15,7 +15,7 @@ pub struct ForkScratchPad { forks: BTreeMap, headers_store: BTreeMap, } - +pub const CONFIRMED_SEGMENT_MINIMUM_LENGTH: i32 = 7; impl ForkScratchPad { pub fn new() -> ForkScratchPad { let mut forks = BTreeMap::new(); @@ -228,7 +228,7 @@ impl ForkScratchPad { } segment }; - if canonical_segment.len() < 7 { + if canonical_segment.len() < CONFIRMED_SEGMENT_MINIMUM_LENGTH as usize { return; } // Any block beyond 6th ancestor is considered as confirmed and can be pruned diff --git a/components/chainhook-sdk/src/indexer/stacks/blocks_pool.rs b/components/chainhook-sdk/src/indexer/stacks/blocks_pool.rs index 33c9c91ea..4e52c7bfb 100644 --- a/components/chainhook-sdk/src/indexer/stacks/blocks_pool.rs +++ b/components/chainhook-sdk/src/indexer/stacks/blocks_pool.rs @@ -1,5 +1,8 @@ use crate::{ - indexer::{ChainSegment, ChainSegmentIncompatibility}, + indexer::{ + fork_scratch_pad::CONFIRMED_SEGMENT_MINIMUM_LENGTH, ChainSegment, + ChainSegmentIncompatibility, + }, utils::Context, }; use chainhook_types::{ @@ -264,7 +267,7 @@ impl StacksBlockPool { segment }; - if canonical_segment.len() < 7 { + if canonical_segment.len() < CONFIRMED_SEGMENT_MINIMUM_LENGTH as usize { ctx.try_log(|logger| slog::info!(logger, "No block to confirm")); return; } From 5503c3d64d9f116bfd4cf71dfbe365b74219ec8d Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 18 Sep 2023 14:07:23 -0400 Subject: [PATCH 54/99] feat: include `contract_abi` in stacks transaction (#378) ### Description #### Breaking change? ### Example --- ### Checklist - [x] All tests pass - [x] Tests added in this PR (if applicable) --- README.md | 3 + components/chainhook-cli/src/cli/mod.rs | 2 + components/chainhook-cli/src/scan/bitcoin.rs | 2 +- .../service/tests/helpers/mock_stacks_node.rs | 1 + .../src/chainhooks/stacks/mod.rs | 72 ++++---- .../base/transaction_contract_deploy.json | 115 ++++++++---- .../chainhook-sdk/src/chainhooks/tests/mod.rs | 115 +++++++++++- .../chainhook-sdk/src/chainhooks/types.rs | 4 + .../chainhook-sdk/src/indexer/stacks/mod.rs | 4 + .../src/indexer/tests/helpers/transactions.rs | 1 + .../chainhook-sdk/src/observer/tests/mod.rs | 1 + .../src/contract_interface.rs | 171 ++++++++++++++++++ components/chainhook-types-rs/src/lib.rs | 2 + components/chainhook-types-rs/src/rosetta.rs | 3 + .../how-to-use-chainhooks-with-stacks.md | 5 +- 15 files changed, 427 insertions(+), 74 deletions(-) create mode 100644 components/chainhook-types-rs/src/contract_interface.rs diff --git a/README.md b/README.md index bd0da3cb7..d6c7169b5 100644 --- a/README.md +++ b/README.md @@ -536,6 +536,9 @@ Additional configuration knobs available: // Include decoded clarity values in payload "decode_clarity_values": true + +// Include the contract ABI for transactions that deploy contracts: +"include_contract_abi": true ``` Putting all the pieces together: diff --git a/components/chainhook-cli/src/cli/mod.rs b/components/chainhook-cli/src/cli/mod.rs index a07a7aebc..8ee706a45 100644 --- a/components/chainhook-cli/src/cli/mod.rs +++ b/components/chainhook-cli/src/cli/mod.rs @@ -342,6 +342,7 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: None, action: HookAction::FileAppend(FileHook { path: "arkadiko.txt".into() }) @@ -358,6 +359,7 @@ async fn handle_command(opts: Opts, ctx: Context) -> Result<(), String> { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: None, action: HookAction::FileAppend(FileHook { path: "arkadiko.txt".into() }) diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 4224104b3..6a2fbff29 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -137,7 +137,7 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( Err((e, _)) => { warn!( ctx.expect_logger(), - "Unable to standardize block#{} {}: {}", current_block_height, block_hash, e + "Unable to standardize block #{} {}: {}", current_block_height, block_hash, e ); continue; } diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs index f591522e6..d2465e358 100644 --- a/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs +++ b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs @@ -24,6 +24,7 @@ fn create_stacks_new_transaction(index: u64) -> NewTransaction { raw_result: format!("0x0703"), raw_tx: format!("0x00000000010400e2cd0871da5bdd38c4d5569493dc3b14aac4e0a10000000000000019000000000000000000008373b16e4a6f9d87864c314dd77bbd8b27a2b1805e96ec5a6509e7e4f833cd6a7bdb2462c95f6968a867ab6b0e8f0a6498e600dbc46cfe9f84c79709da7b9637010200000000040000000000000000000000000000000000000000000000000000000000000000"), execution_cost: None, + contract_abi: None } } diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 766c4cf4f..1c9eb857a 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -508,17 +508,41 @@ pub fn evaluate_stacks_predicate_on_transaction<'a>( } } -fn encode_transaction_including_with_clarity_decoding( - transaction: &StacksTransactionData, +fn serialize_stacks_block( + block: &dyn AbstractStacksBlock, + transactions: Vec<&StacksTransactionData>, + decode_clarity_values: bool, + include_contract_abi: bool, ctx: &Context, ) -> serde_json::Value { json!({ + "block_identifier": block.get_identifier(), + "parent_block_identifier": block.get_parent_identifier(), + "timestamp": block.get_timestamp(), + "transactions": transactions.into_iter().map(|transaction| { + serialize_stacks_transaction(&transaction, decode_clarity_values, include_contract_abi, ctx) + }).collect::>(), + "metadata": block.get_serialized_metadata(), + }) +} + +fn serialize_stacks_transaction( + transaction: &StacksTransactionData, + decode_clarity_values: bool, + include_contract_abi: bool, + ctx: &Context, +) -> serde_json::Value { + let mut json = json!({ "transaction_identifier": transaction.transaction_identifier, "operations": transaction.operations, "metadata": { "success": transaction.metadata.success, "raw_tx": transaction.metadata.raw_tx, - "result": serialized_decoded_clarity_value(&transaction.metadata.result, ctx), + "result": if decode_clarity_values { + serialized_decoded_clarity_value(&transaction.metadata.result, ctx) + } else { + json!(transaction.metadata.result) + }, "sender": transaction.metadata.sender, "fee": transaction.metadata.fee, "kind": transaction.metadata.kind, @@ -527,15 +551,21 @@ fn encode_transaction_including_with_clarity_decoding( "mutated_assets_radius": transaction.metadata.receipt.mutated_assets_radius, "contract_calls_stack": transaction.metadata.receipt.contract_calls_stack, "events": transaction.metadata.receipt.events.iter().map(|event| { - serialized_event_with_decoded_clarity_value(event, ctx) + if decode_clarity_values { serialized_event_with_decoded_clarity_value(event, ctx) } else { json!(event) } }).collect::>(), }, "description": transaction.metadata.description, "sponsor": transaction.metadata.sponsor, "execution_cost": transaction.metadata.execution_cost, - "position": transaction.metadata.position, + "position": transaction.metadata.position }, - }) + }); + if include_contract_abi { + if let Some(abi) = &transaction.metadata.contract_abi { + json["metadata"]["contract_abi"] = json!(abi); + } + } + json } pub fn serialized_event_with_decoded_clarity_value( @@ -764,37 +794,13 @@ pub fn serialize_stacks_payload_to_json<'a>( ctx: &Context, ) -> JsonValue { let decode_clarity_values = trigger.should_decode_clarity_value(); + let include_contract_abi = trigger.chainhook.include_contract_abi; json!({ "apply": trigger.apply.into_iter().map(|(transactions, block)| { - json!({ - "block_identifier": block.get_identifier(), - "parent_block_identifier": block.get_parent_identifier(), - "timestamp": block.get_timestamp(), - "transactions": transactions.iter().map(|transaction| { - if decode_clarity_values { - encode_transaction_including_with_clarity_decoding(transaction, ctx) - } else { - json!(transaction) - } - }).collect::>(), - "metadata": block.get_serialized_metadata(), - }) + serialize_stacks_block(block, transactions, decode_clarity_values, include_contract_abi, ctx) }).collect::>(), "rollback": trigger.rollback.into_iter().map(|(transactions, block)| { - json!({ - "block_identifier": block.get_identifier(), - "parent_block_identifier": block.get_parent_identifier(), - "timestamp": block.get_timestamp(), - "transactions": transactions.iter().map(|transaction| { - if decode_clarity_values { - encode_transaction_including_with_clarity_decoding(transaction, ctx) - } else { - json!(transaction) - } - }).collect::>(), - "metadata": block.get_serialized_metadata(), - // "proof": proofs.get(&transaction.transaction_identifier), - }) + serialize_stacks_block(block, transactions, decode_clarity_values, include_contract_abi, ctx) }).collect::>(), "chainhook": { "uuid": trigger.chainhook.uuid, diff --git a/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/base/transaction_contract_deploy.json b/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/base/transaction_contract_deploy.json index 12d266544..6502f6428 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/base/transaction_contract_deploy.json +++ b/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/base/transaction_contract_deploy.json @@ -1,41 +1,80 @@ { - "metadata": { - "description": "", - "execution_cost": { - "read_count": 8, - "read_length": 6, - "runtime": 84581, - "write_count": 13, - "write_length": 1612 - }, - "fee": 750000, - "kind": { - "data": { - "code": ";; The .subnet contract\n\n(define-constant CONTRACT_ADDRESS (as-contract tx-sender))\n\n;; Error codes\n(define-constant ERR_BLOCK_ALREADY_COMMITTED 1)\n(define-constant ERR_INVALID_MINER 2)\n(define-constant ERR_CONTRACT_CALL_FAILED 3)\n(define-constant ERR_TRANSFER_FAILED 4)\n(define-constant ERR_DISALLOWED_ASSET 5)\n(define-constant ERR_ASSET_ALREADY_ALLOWED 6)\n(define-constant ERR_MERKLE_ROOT_DOES_NOT_MATCH 7)\n(define-constant ERR_INVALID_MERKLE_ROOT 8)\n(define-constant ERR_WITHDRAWAL_ALREADY_PROCESSED 9)\n(define-constant ERR_VALIDATION_FAILED 10)\n;;; The value supplied for `target-chain-tip` does not match the current chain tip.\n(define-constant ERR_INVALID_CHAIN_TIP 11)\n;;; The contract was called before reaching this-chain height reaches 1.\n(define-constant ERR_CALLED_TOO_EARLY 12)\n(define-constant ERR_MINT_FAILED 13)\n(define-constant ERR_ATTEMPT_TO_TRANSFER_ZERO_AMOUNT 14)\n(define-constant ERR_IN_COMPUTATION 15)\n;; The contract does not own this NFT to withdraw it.\n(define-constant ERR_NFT_NOT_OWNED_BY_CONTRACT 16)\n(define-constant ERR_VALIDATION_LEAF_FAILED 30)\n\n;; Map from Stacks block height to block commit\n(define-map block-commits uint (buff 32))\n;; Map recording withdrawal roots\n(define-map withdrawal-roots-map (buff 32) bool)\n;; Map recording processed withdrawal leaves\n(define-map processed-withdrawal-leaves-map { withdrawal-leaf-hash: (buff 32), withdrawal-root-hash: (buff 32) } bool)\n\n;; principal that can commit blocks\n(define-data-var miner principal tx-sender)\n;; principal that can register contracts\n(define-data-var admin principal 'ST167FDXCJGS54J1T0J42VTX46G0QQQFRJGBK28RN)\n\n;; Map of allowed contracts for asset transfers - maps L1 contract principal to L2 contract principal\n(define-map allowed-contracts principal principal)\n\n;; Use trait declarations\n(use-trait nft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.nft-trait)\n(use-trait ft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.sip-010-trait)\n(use-trait mint-from-subnet-trait .subnet-traits-v1.mint-from-subnet-trait)\n\n;; Update the miner for this contract.\n(define-public (update-miner (new-miner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get miner)) (err ERR_INVALID_MINER))\n (ok (var-set miner new-miner))\n )\n)\n\n;; Register a new FT contract to be supported by this subnet.\n(define-public (register-new-ft-contract (ft-contract ) (l2-contract principal))\n (begin\n ;; Verify that tx-sender is an authorized admin\n (asserts! (is-admin tx-sender) (err ERR_INVALID_MINER))\n\n ;; Set up the assets that the contract is allowed to transfer\n (asserts! (map-insert allowed-contracts (contract-of ft-contract) l2-contract)\n (err ERR_ASSET_ALREADY_ALLOWED))\n\n (print {\n event: \"register-contract\",\n asset-type: \"ft\",\n l1-contract: (contract-of ft-contract),\n l2-contract: l2-contract\n })\n\n (ok true)\n )\n)\n\n;; Register a new NFT contract to be supported by this subnet.\n(define-public (register-new-nft-contract (nft-contract ) (l2-contract principal))\n (begin\n ;; Verify that tx-sender is an authorized admin\n (asserts! (is-admin tx-sender) (err ERR_INVALID_MINER))\n\n ;; Set up the assets that the contract is allowed to transfer\n (asserts! (map-insert allowed-contracts (contract-of nft-contract) l2-contract)\n (err ERR_ASSET_ALREADY_ALLOWED))\n\n (print {\n event: \"register-contract\",\n asset-type: \"nft\",\n l1-contract: (contract-of nft-contract),\n l2-contract: l2-contract\n })\n\n (ok true)\n )\n)\n\n;; Helper function: returns a boolean indicating whether the given principal is a miner\n;; Returns bool\n(define-private (is-miner (miner-to-check principal))\n (is-eq miner-to-check (var-get miner))\n)\n\n;; Helper function: returns a boolean indicating whether the given principal is an admin\n;; Returns bool\n(define-private (is-admin (addr-to-check principal))\n (is-eq addr-to-check (var-get admin))\n)\n\n;; Helper function: determines whether the commit-block operation satisfies pre-conditions\n;; listed in `commit-block`.\n;; Returns response\n(define-private (can-commit-block? (commit-block-height uint) (target-chain-tip (buff 32)))\n (begin\n ;; check no block has been committed at this height\n (asserts! (is-none (map-get? block-commits commit-block-height)) (err ERR_BLOCK_ALREADY_COMMITTED))\n\n ;; check that `target-chain-tip` matches the burn chain tip\n (asserts! (is-eq\n target-chain-tip\n (unwrap! (get-block-info? id-header-hash (- block-height u1)) (err ERR_CALLED_TOO_EARLY)) )\n (err ERR_INVALID_CHAIN_TIP))\n\n ;; check that the tx sender is one of the miners\n (asserts! (is-miner tx-sender) (err ERR_INVALID_MINER))\n\n ;; check that the miner called this contract directly\n (asserts! (is-miner contract-caller) (err ERR_INVALID_MINER))\n\n (ok true)\n )\n)\n\n;; Helper function: modifies the block-commits map with a new commit and prints related info\n;; Returns response<(buff 32), ?>\n(define-private (inner-commit-block (block (buff 32)) (commit-block-height uint) (withdrawal-root (buff 32)))\n (begin\n (map-set block-commits commit-block-height block)\n (map-set withdrawal-roots-map withdrawal-root true)\n (print {\n event: \"block-commit\",\n block-commit: block,\n withdrawal-root: withdrawal-root,\n block-height: commit-block-height\n })\n (ok block)\n )\n)\n\n;; The subnet miner calls this function to commit a block at a particular height.\n;; `block` is the hash of the block being submitted.\n;; `target-chain-tip` is the `id-header-hash` of the burn block (i.e., block on\n;; this chain) that the miner intends to build off.\n;;\n;; Fails if:\n;; 1) we have already committed at this block height\n;; 2) `target-chain-tip` is not the burn chain tip (i.e., on this chain)\n;; 3) the sender is not a miner\n(define-public (commit-block (block (buff 32)) (target-chain-tip (buff 32)) (withdrawal-root (buff 32)))\n (let ((commit-block-height block-height))\n (try! (can-commit-block? commit-block-height target-chain-tip))\n (inner-commit-block block commit-block-height withdrawal-root)\n )\n)\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR NFT ASSET TRANSFERS\n\n;; Helper function that transfers the specified NFT from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-nft-asset\n (nft-contract )\n (id uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract transfer id sender recipient))\n (transfer-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-mint-nft-asset\n (nft-mint-contract )\n (id uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (as-contract (contract-call? nft-mint-contract mint-from-subnet id sender recipient)))\n (mint-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! mint-result (err ERR_MINT_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-transfer-or-mint-nft-asset\n (nft-contract )\n (nft-mint-contract )\n (id uint)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract get-owner id))\n (nft-owner (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-nft (is-eq nft-owner (some CONTRACT_ADDRESS)))\n (no-owner (is-eq nft-owner none))\n )\n\n (if contract-owns-nft\n (inner-transfer-nft-asset nft-contract id CONTRACT_ADDRESS recipient)\n (if no-owner\n ;; Try minting the asset if there is no existing owner of this NFT\n (inner-mint-nft-asset nft-mint-contract id CONTRACT_ADDRESS recipient)\n ;; In this case, a principal other than this contract owns this NFT, so minting is not possible\n (err ERR_MINT_FAILED)\n )\n )\n )\n)\n\n;; A user calls this function to deposit an NFT into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-nft-asset\n (nft-contract )\n (id uint)\n (sender principal)\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (subnet-contract-id (unwrap! (map-get? allowed-contracts (contract-of nft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n\n ;; Try to transfer the NFT to this contract\n (asserts! (try! (inner-transfer-nft-asset nft-contract id sender CONTRACT_ADDRESS)) (err ERR_TRANSFER_FAILED))\n\n ;; Emit a print event - the node consumes this\n (print {\n event: \"deposit-nft\",\n l1-contract-id: (as-contract nft-contract),\n nft-id: id,\n sender: sender,\n subnet-contract-id: subnet-contract-id,\n })\n\n (ok true)\n )\n)\n\n\n;; Helper function for `withdraw-nft-asset`\n;; Returns response\n(define-public (inner-withdraw-nft-asset\n (nft-contract )\n (l2-contract principal)\n (id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (nft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-nft l2-contract id recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts!\n (try!\n (match nft-mint-contract\n mint-contract (as-contract (inner-transfer-or-mint-nft-asset nft-contract mint-contract id recipient))\n (as-contract (inner-transfer-without-mint-nft-asset nft-contract id recipient))\n )\n )\n (err ERR_TRANSFER_FAILED)\n )\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED)\n )\n\n (ok true)\n )\n)\n\n;; A user calls this function to withdraw the specified NFT from this contract.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-nft-asset\n (nft-contract )\n (id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (nft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (l2-contract (unwrap! (map-get? allowed-contracts (contract-of nft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n (asserts!\n (try! (inner-withdraw-nft-asset\n nft-contract\n l2-contract\n id\n recipient\n withdrawal-id\n height\n nft-mint-contract\n withdrawal-root\n withdrawal-leaf-hash\n sibling-hashes\n ))\n (err ERR_TRANSFER_FAILED)\n )\n\n ;; Emit a print event\n (print {\n event: \"withdraw-nft\",\n l1-contract-id: (as-contract nft-contract),\n nft-id: id,\n recipient: recipient\n })\n\n (ok true)\n )\n)\n\n\n;; Like `inner-transfer-or-mint-nft-asset but without allowing or requiring a mint function. In order to withdraw, the user must\n;; have the appropriate balance.\n(define-private (inner-transfer-without-mint-nft-asset\n (nft-contract )\n (id uint)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract get-owner id))\n (nft-owner (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-nft (is-eq nft-owner (some CONTRACT_ADDRESS)))\n )\n\n (asserts! contract-owns-nft (err ERR_NFT_NOT_OWNED_BY_CONTRACT))\n (inner-transfer-nft-asset nft-contract id CONTRACT_ADDRESS recipient)\n )\n)\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR FUNGIBLE TOKEN ASSET TRANSFERS\n\n;; Helper function that transfers a specified amount of the fungible token from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-ft-asset\n (ft-contract )\n (amount uint)\n (sender principal)\n (recipient principal)\n (memo (optional (buff 34)))\n )\n (let (\n (call-result (contract-call? ft-contract transfer amount sender recipient memo))\n (transfer-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; FIXME: SIP-010 doesn't require that transfer returns (ok true) on success, so is this check necessary?\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-mint-ft-asset\n (ft-mint-contract )\n (amount uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (as-contract (contract-call? ft-mint-contract mint-from-subnet amount sender recipient)))\n (mint-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! mint-result (err ERR_MINT_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-transfer-or-mint-ft-asset\n (ft-contract )\n (ft-mint-contract )\n (amount uint)\n (recipient principal)\n (memo (optional (buff 34)))\n )\n (let (\n (call-result (contract-call? ft-contract get-balance CONTRACT_ADDRESS))\n (contract-ft-balance (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-enough (>= contract-ft-balance amount))\n (amount-to-transfer (if contract-owns-enough amount contract-ft-balance))\n (amount-to-mint (- amount amount-to-transfer))\n )\n\n ;; Check that the total balance between the transfer and mint is equal to the original balance\n (asserts! (is-eq amount (+ amount-to-transfer amount-to-mint)) (err ERR_IN_COMPUTATION))\n\n (and\n (> amount-to-transfer u0)\n (try! (inner-transfer-ft-asset ft-contract amount-to-transfer CONTRACT_ADDRESS recipient memo))\n )\n (and\n (> amount-to-mint u0)\n (try! (inner-mint-ft-asset ft-mint-contract amount-to-mint CONTRACT_ADDRESS recipient))\n )\n\n (ok true)\n )\n)\n\n;; A user calls this function to deposit a fungible token into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-ft-asset\n (ft-contract )\n (amount uint)\n (sender principal)\n (memo (optional (buff 34)))\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (subnet-contract-id (unwrap! (map-get? allowed-contracts (contract-of ft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n ;; Try to transfer the FT to this contract\n (asserts! (try! (inner-transfer-ft-asset ft-contract amount sender CONTRACT_ADDRESS memo)) (err ERR_TRANSFER_FAILED))\n\n (let (\n (ft-name (unwrap! (contract-call? ft-contract get-name) (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Emit a print event - the node consumes this\n (print {\n event: \"deposit-ft\",\n l1-contract-id: (as-contract ft-contract),\n ft-name: ft-name,\n ft-amount: amount,\n sender: sender,\n subnet-contract-id: subnet-contract-id,\n })\n )\n\n (ok true)\n )\n)\n\n;; This function performs validity checks related to the withdrawal and performs the withdrawal as well.\n;; Returns response\n(define-private (inner-withdraw-ft-asset\n (ft-contract )\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (memo (optional (buff 34)))\n (ft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-ft (contract-of ft-contract) amount recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts!\n (try!\n (match ft-mint-contract\n mint-contract (as-contract (inner-transfer-or-mint-ft-asset ft-contract mint-contract amount recipient memo))\n (as-contract (inner-transfer-ft-asset ft-contract amount CONTRACT_ADDRESS recipient memo))\n )\n )\n (err ERR_TRANSFER_FAILED)\n )\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n (ok true)\n )\n)\n\n;; A user can call this function to withdraw some amount of a fungible token asset from the\n;; contract and send it to a recipient.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-ft-asset\n (ft-contract )\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (memo (optional (buff 34)))\n (ft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (begin\n ;; Check that the withdraw amount is positive\n (asserts! (> amount u0) (err ERR_ATTEMPT_TO_TRANSFER_ZERO_AMOUNT))\n\n ;; Check that the asset belongs to the allowed-contracts map\n (unwrap! (map-get? allowed-contracts (contract-of ft-contract)) (err ERR_DISALLOWED_ASSET))\n\n (asserts!\n (try! (inner-withdraw-ft-asset\n ft-contract\n amount\n recipient\n withdrawal-id\n height\n memo\n ft-mint-contract\n withdrawal-root\n withdrawal-leaf-hash\n sibling-hashes))\n (err ERR_TRANSFER_FAILED)\n )\n\n (let (\n (ft-name (unwrap! (contract-call? ft-contract get-name) (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Emit a print event\n (print {\n event: \"withdraw-ft\",\n l1-contract-id: (as-contract ft-contract),\n ft-name: ft-name,\n ft-amount: amount,\n recipient: recipient,\n })\n )\n\n (ok true)\n )\n)\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR STX TRANSFERS\n\n\n;; Helper function that transfers the given amount from the specified fungible token from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-stx (amount uint) (sender principal) (recipient principal))\n (let (\n (call-result (stx-transfer? amount sender recipient))\n (transfer-result (unwrap! call-result (err ERR_TRANSFER_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n;; A user calls this function to deposit STX into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-stx (amount uint) (sender principal))\n (begin\n ;; Try to transfer the STX to this contract\n (asserts! (try! (inner-transfer-stx amount sender CONTRACT_ADDRESS)) (err ERR_TRANSFER_FAILED))\n\n ;; Emit a print event - the node consumes this\n (print { event: \"deposit-stx\", sender: sender, amount: amount })\n\n (ok true)\n )\n)\n\n(define-read-only (leaf-hash-withdraw-stx\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"stx\",\n amount: amount,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n(define-read-only (leaf-hash-withdraw-nft\n (asset-contract principal)\n (nft-id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"nft\",\n nft-id: nft-id,\n asset-contract: asset-contract,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n(define-read-only (leaf-hash-withdraw-ft\n (asset-contract principal)\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"ft\",\n amount: amount,\n asset-contract: asset-contract,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n;; A user calls this function to withdraw STX from this contract.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-stx\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-stx amount recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts! (try! (as-contract (inner-transfer-stx amount tx-sender recipient))) (err ERR_TRANSFER_FAILED))\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n ;; Emit a print event\n (print { event: \"withdraw-stx\", recipient: recipient, amount: amount })\n\n (ok true)\n )\n)\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; GENERAL WITHDRAWAL FUNCTIONS\n\n;; This function concats the two given hashes in the correct order. It also prepends the buff `0x01`, which is\n;; a tag denoting a node (versus a leaf).\n;; Returns a buff\n(define-private (create-node-hash\n (curr-hash (buff 32))\n (sibling-hash (buff 32))\n (is-sibling-left-side bool)\n )\n (let (\n (concatted-hash (if is-sibling-left-side\n (concat sibling-hash curr-hash)\n (concat curr-hash sibling-hash)\n ))\n )\n\n (concat 0x01 concatted-hash)\n )\n)\n\n;; This function hashes the curr hash with its sibling hash.\n;; Returns (buff 32)\n(define-private (hash-help\n (sibling {\n hash: (buff 32),\n is-left-side: bool,\n })\n (curr-node-hash (buff 32))\n )\n (let (\n (sibling-hash (get hash sibling))\n (is-sibling-left-side (get is-left-side sibling))\n (new-buff (create-node-hash curr-node-hash sibling-hash is-sibling-left-side))\n )\n (sha512/256 new-buff)\n )\n)\n\n;; This function checks:\n;; - That the provided withdrawal root matches a previously submitted one (passed to the function `commit-block`)\n;; - That the computed withdrawal root matches a previous valid withdrawal root\n;; - That the given withdrawal leaf hash has not been previously processed\n;; Returns response\n(define-private (check-withdrawal-hashes\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (begin\n ;; Check that the user submitted a valid withdrawal root\n (asserts! (is-some (map-get? withdrawal-roots-map withdrawal-root)) (err ERR_INVALID_MERKLE_ROOT))\n\n ;; Check that this withdrawal leaf has not been processed before\n (asserts!\n (is-none\n (map-get? processed-withdrawal-leaves-map\n { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root }))\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n (let ((calculated-withdrawal-root (fold hash-help sibling-hashes withdrawal-leaf-hash))\n (roots-match (is-eq calculated-withdrawal-root withdrawal-root)))\n (if roots-match\n (ok true)\n (err ERR_MERKLE_ROOT_DOES_NOT_MATCH))\n )\n )\n)\n\n;; This function should be called after the asset in question has been transferred.\n;; It adds the withdrawal leaf hash to a map of processed leaves. This ensures that\n;; this withdrawal leaf can't be used again to withdraw additional funds.\n;; Returns bool\n(define-private (finish-withdraw\n (withdraw-info {\n withdrawal-leaf-hash: (buff 32),\n withdrawal-root-hash: (buff 32)\n })\n )\n (map-insert processed-withdrawal-leaves-map withdraw-info true)\n)\n", - "contract_identifier": "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1" - }, - "type": "ContractDeployment" - }, - "nonce": 33, - "position": { - "index": 1 - }, - "proof": null, - "raw_tx": "0x808000000004003e44ad50f99edc5e6cc5543b636284186894a008000000000000002100000000000b71b00000a84691e27fd2d46475230707a657ef7ddf6de7a4b06a1ac2049384c6474e73f85ee4ce205e0904160adaa160498df02db1782f898b5905db4d249b7025f6604c030100000000060218666169722d616d6172616e74682d7268696e6f6365726f73000005103b3b2068656c6c6f2d776f726c6420636f6e74726163740a0a28646566696e652d636f6e7374616e742073656e6465722027535a324a365a593438475631455a35563256355242394d5036365357383650594b4b51394836445052290a28646566696e652d636f6e7374616e7420726563697069656e742027534d324a365a593438475631455a35563256355242394d5036365357383650594b4b51565838583047290a0a28646566696e652d66756e6769626c652d746f6b656e206e6f76656c2d746f6b656e2d3139290a28626567696e202866742d6d696e743f206e6f76656c2d746f6b656e2d3139207531322073656e64657229290a28626567696e202866742d7472616e736665723f206e6f76656c2d746f6b656e2d31392075322073656e64657220726563697069656e7429290a0a28646566696e652d6e6f6e2d66756e6769626c652d746f6b656e2068656c6c6f2d6e66742075696e74290a28626567696e20286e66742d6d696e743f2068656c6c6f2d6e66742075312073656e64657229290a28626567696e20286e66742d6d696e743f2068656c6c6f2d6e66742075322073656e64657229290a28626567696e20286e66742d7472616e736665723f2068656c6c6f2d6e66742075312073656e64657220726563697069656e7429290a0a28646566696e652d7075626c69632028746573742d656d69742d6576656e74290a2020202028626567696e0a2020202020202020287072696e7420224576656e74212048656c6c6f20776f726c6422290a2020202020202020286f6b2075312929290a28626567696e2028746573742d656d69742d6576656e7429290a0a28646566696e652d7075626c69632028746573742d6576656e742d7479706573290a2020202028626567696e0a202020202020202028756e777261702d70616e6963202866742d6d696e743f206e6f76656c2d746f6b656e2d313920753320726563697069656e7429290a202020202020202028756e777261702d70616e696320286e66742d6d696e743f2068656c6c6f2d6e667420753220726563697069656e7429290a202020202020202028756e777261702d70616e696320287374782d7472616e736665723f207536302074782d73656e6465722027535a324a365a593438475631455a35563256355242394d5036365357383650594b4b5139483644505229290a202020202020202028756e777261702d70616e696320287374782d6275726e3f207532302074782d73656e64657229290a2020202020202020286f6b2075312929290a0a28646566696e652d6d61702073746f7265207b6b65793a202862756666203332297d207b76616c75653a202862756666203332297d290a28646566696e652d7075626c696320286765742d76616c756520286b65792028627566662033322929290a2020202028626567696e0a2020202020202020286d6174636820286d61702d6765743f2073746f7265207b6b65793a206b65797d290a202020202020202020202020656e74727920286f6b20286765742076616c756520656e74727929290a202020202020202020202020286572722030292929290a28646566696e652d7075626c696320287365742d76616c756520286b65792028627566662033322929202876616c75652028627566662033322929290a2020202028626567696e0a2020202020202020286d61702d7365742073746f7265207b6b65793a206b65797d207b76616c75653a2076616c75657d290a2020202020202020286f6b207531292929", - "receipt": { - "contract_calls_stack": [], - "events": [], - "mutated_assets_radius": [], - "mutated_contracts_radius": [ - "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1" + "metadata": { + "description": "", + "execution_cost": { + "read_count": 8, + "read_length": 6, + "runtime": 84581, + "write_count": 13, + "write_length": 1612 + }, + "fee": 750000, + "kind": { + "data": { + "code": ";; The .subnet contract\n\n(define-constant CONTRACT_ADDRESS (as-contract tx-sender))\n\n;; Error codes\n(define-constant ERR_BLOCK_ALREADY_COMMITTED 1)\n(define-constant ERR_INVALID_MINER 2)\n(define-constant ERR_CONTRACT_CALL_FAILED 3)\n(define-constant ERR_TRANSFER_FAILED 4)\n(define-constant ERR_DISALLOWED_ASSET 5)\n(define-constant ERR_ASSET_ALREADY_ALLOWED 6)\n(define-constant ERR_MERKLE_ROOT_DOES_NOT_MATCH 7)\n(define-constant ERR_INVALID_MERKLE_ROOT 8)\n(define-constant ERR_WITHDRAWAL_ALREADY_PROCESSED 9)\n(define-constant ERR_VALIDATION_FAILED 10)\n;;; The value supplied for `target-chain-tip` does not match the current chain tip.\n(define-constant ERR_INVALID_CHAIN_TIP 11)\n;;; The contract was called before reaching this-chain height reaches 1.\n(define-constant ERR_CALLED_TOO_EARLY 12)\n(define-constant ERR_MINT_FAILED 13)\n(define-constant ERR_ATTEMPT_TO_TRANSFER_ZERO_AMOUNT 14)\n(define-constant ERR_IN_COMPUTATION 15)\n;; The contract does not own this NFT to withdraw it.\n(define-constant ERR_NFT_NOT_OWNED_BY_CONTRACT 16)\n(define-constant ERR_VALIDATION_LEAF_FAILED 30)\n\n;; Map from Stacks block height to block commit\n(define-map block-commits uint (buff 32))\n;; Map recording withdrawal roots\n(define-map withdrawal-roots-map (buff 32) bool)\n;; Map recording processed withdrawal leaves\n(define-map processed-withdrawal-leaves-map { withdrawal-leaf-hash: (buff 32), withdrawal-root-hash: (buff 32) } bool)\n\n;; principal that can commit blocks\n(define-data-var miner principal tx-sender)\n;; principal that can register contracts\n(define-data-var admin principal 'ST167FDXCJGS54J1T0J42VTX46G0QQQFRJGBK28RN)\n\n;; Map of allowed contracts for asset transfers - maps L1 contract principal to L2 contract principal\n(define-map allowed-contracts principal principal)\n\n;; Use trait declarations\n(use-trait nft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.nft-trait.nft-trait)\n(use-trait ft-trait 'ST1NXBK3K5YYMD6FD41MVNP3JS1GABZ8TRVX023PT.sip-010-trait-ft-standard.sip-010-trait)\n(use-trait mint-from-subnet-trait .subnet-traits-v1.mint-from-subnet-trait)\n\n;; Update the miner for this contract.\n(define-public (update-miner (new-miner principal))\n (begin\n (asserts! (is-eq tx-sender (var-get miner)) (err ERR_INVALID_MINER))\n (ok (var-set miner new-miner))\n )\n)\n\n;; Register a new FT contract to be supported by this subnet.\n(define-public (register-new-ft-contract (ft-contract ) (l2-contract principal))\n (begin\n ;; Verify that tx-sender is an authorized admin\n (asserts! (is-admin tx-sender) (err ERR_INVALID_MINER))\n\n ;; Set up the assets that the contract is allowed to transfer\n (asserts! (map-insert allowed-contracts (contract-of ft-contract) l2-contract)\n (err ERR_ASSET_ALREADY_ALLOWED))\n\n (print {\n event: \"register-contract\",\n asset-type: \"ft\",\n l1-contract: (contract-of ft-contract),\n l2-contract: l2-contract\n })\n\n (ok true)\n )\n)\n\n;; Register a new NFT contract to be supported by this subnet.\n(define-public (register-new-nft-contract (nft-contract ) (l2-contract principal))\n (begin\n ;; Verify that tx-sender is an authorized admin\n (asserts! (is-admin tx-sender) (err ERR_INVALID_MINER))\n\n ;; Set up the assets that the contract is allowed to transfer\n (asserts! (map-insert allowed-contracts (contract-of nft-contract) l2-contract)\n (err ERR_ASSET_ALREADY_ALLOWED))\n\n (print {\n event: \"register-contract\",\n asset-type: \"nft\",\n l1-contract: (contract-of nft-contract),\n l2-contract: l2-contract\n })\n\n (ok true)\n )\n)\n\n;; Helper function: returns a boolean indicating whether the given principal is a miner\n;; Returns bool\n(define-private (is-miner (miner-to-check principal))\n (is-eq miner-to-check (var-get miner))\n)\n\n;; Helper function: returns a boolean indicating whether the given principal is an admin\n;; Returns bool\n(define-private (is-admin (addr-to-check principal))\n (is-eq addr-to-check (var-get admin))\n)\n\n;; Helper function: determines whether the commit-block operation satisfies pre-conditions\n;; listed in `commit-block`.\n;; Returns response\n(define-private (can-commit-block? (commit-block-height uint) (target-chain-tip (buff 32)))\n (begin\n ;; check no block has been committed at this height\n (asserts! (is-none (map-get? block-commits commit-block-height)) (err ERR_BLOCK_ALREADY_COMMITTED))\n\n ;; check that `target-chain-tip` matches the burn chain tip\n (asserts! (is-eq\n target-chain-tip\n (unwrap! (get-block-info? id-header-hash (- block-height u1)) (err ERR_CALLED_TOO_EARLY)) )\n (err ERR_INVALID_CHAIN_TIP))\n\n ;; check that the tx sender is one of the miners\n (asserts! (is-miner tx-sender) (err ERR_INVALID_MINER))\n\n ;; check that the miner called this contract directly\n (asserts! (is-miner contract-caller) (err ERR_INVALID_MINER))\n\n (ok true)\n )\n)\n\n;; Helper function: modifies the block-commits map with a new commit and prints related info\n;; Returns response<(buff 32), ?>\n(define-private (inner-commit-block (block (buff 32)) (commit-block-height uint) (withdrawal-root (buff 32)))\n (begin\n (map-set block-commits commit-block-height block)\n (map-set withdrawal-roots-map withdrawal-root true)\n (print {\n event: \"block-commit\",\n block-commit: block,\n withdrawal-root: withdrawal-root,\n block-height: commit-block-height\n })\n (ok block)\n )\n)\n\n;; The subnet miner calls this function to commit a block at a particular height.\n;; `block` is the hash of the block being submitted.\n;; `target-chain-tip` is the `id-header-hash` of the burn block (i.e., block on\n;; this chain) that the miner intends to build off.\n;;\n;; Fails if:\n;; 1) we have already committed at this block height\n;; 2) `target-chain-tip` is not the burn chain tip (i.e., on this chain)\n;; 3) the sender is not a miner\n(define-public (commit-block (block (buff 32)) (target-chain-tip (buff 32)) (withdrawal-root (buff 32)))\n (let ((commit-block-height block-height))\n (try! (can-commit-block? commit-block-height target-chain-tip))\n (inner-commit-block block commit-block-height withdrawal-root)\n )\n)\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR NFT ASSET TRANSFERS\n\n;; Helper function that transfers the specified NFT from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-nft-asset\n (nft-contract )\n (id uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract transfer id sender recipient))\n (transfer-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-mint-nft-asset\n (nft-mint-contract )\n (id uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (as-contract (contract-call? nft-mint-contract mint-from-subnet id sender recipient)))\n (mint-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! mint-result (err ERR_MINT_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-transfer-or-mint-nft-asset\n (nft-contract )\n (nft-mint-contract )\n (id uint)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract get-owner id))\n (nft-owner (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-nft (is-eq nft-owner (some CONTRACT_ADDRESS)))\n (no-owner (is-eq nft-owner none))\n )\n\n (if contract-owns-nft\n (inner-transfer-nft-asset nft-contract id CONTRACT_ADDRESS recipient)\n (if no-owner\n ;; Try minting the asset if there is no existing owner of this NFT\n (inner-mint-nft-asset nft-mint-contract id CONTRACT_ADDRESS recipient)\n ;; In this case, a principal other than this contract owns this NFT, so minting is not possible\n (err ERR_MINT_FAILED)\n )\n )\n )\n)\n\n;; A user calls this function to deposit an NFT into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-nft-asset\n (nft-contract )\n (id uint)\n (sender principal)\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (subnet-contract-id (unwrap! (map-get? allowed-contracts (contract-of nft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n\n ;; Try to transfer the NFT to this contract\n (asserts! (try! (inner-transfer-nft-asset nft-contract id sender CONTRACT_ADDRESS)) (err ERR_TRANSFER_FAILED))\n\n ;; Emit a print event - the node consumes this\n (print {\n event: \"deposit-nft\",\n l1-contract-id: (as-contract nft-contract),\n nft-id: id,\n sender: sender,\n subnet-contract-id: subnet-contract-id,\n })\n\n (ok true)\n )\n)\n\n\n;; Helper function for `withdraw-nft-asset`\n;; Returns response\n(define-public (inner-withdraw-nft-asset\n (nft-contract )\n (l2-contract principal)\n (id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (nft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-nft l2-contract id recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts!\n (try!\n (match nft-mint-contract\n mint-contract (as-contract (inner-transfer-or-mint-nft-asset nft-contract mint-contract id recipient))\n (as-contract (inner-transfer-without-mint-nft-asset nft-contract id recipient))\n )\n )\n (err ERR_TRANSFER_FAILED)\n )\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED)\n )\n\n (ok true)\n )\n)\n\n;; A user calls this function to withdraw the specified NFT from this contract.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-nft-asset\n (nft-contract )\n (id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (nft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (l2-contract (unwrap! (map-get? allowed-contracts (contract-of nft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n (asserts!\n (try! (inner-withdraw-nft-asset\n nft-contract\n l2-contract\n id\n recipient\n withdrawal-id\n height\n nft-mint-contract\n withdrawal-root\n withdrawal-leaf-hash\n sibling-hashes\n ))\n (err ERR_TRANSFER_FAILED)\n )\n\n ;; Emit a print event\n (print {\n event: \"withdraw-nft\",\n l1-contract-id: (as-contract nft-contract),\n nft-id: id,\n recipient: recipient\n })\n\n (ok true)\n )\n)\n\n\n;; Like `inner-transfer-or-mint-nft-asset but without allowing or requiring a mint function. In order to withdraw, the user must\n;; have the appropriate balance.\n(define-private (inner-transfer-without-mint-nft-asset\n (nft-contract )\n (id uint)\n (recipient principal)\n )\n (let (\n (call-result (contract-call? nft-contract get-owner id))\n (nft-owner (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-nft (is-eq nft-owner (some CONTRACT_ADDRESS)))\n )\n\n (asserts! contract-owns-nft (err ERR_NFT_NOT_OWNED_BY_CONTRACT))\n (inner-transfer-nft-asset nft-contract id CONTRACT_ADDRESS recipient)\n )\n)\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR FUNGIBLE TOKEN ASSET TRANSFERS\n\n;; Helper function that transfers a specified amount of the fungible token from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-ft-asset\n (ft-contract )\n (amount uint)\n (sender principal)\n (recipient principal)\n (memo (optional (buff 34)))\n )\n (let (\n (call-result (contract-call? ft-contract transfer amount sender recipient memo))\n (transfer-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; FIXME: SIP-010 doesn't require that transfer returns (ok true) on success, so is this check necessary?\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-mint-ft-asset\n (ft-mint-contract )\n (amount uint)\n (sender principal)\n (recipient principal)\n )\n (let (\n (call-result (as-contract (contract-call? ft-mint-contract mint-from-subnet amount sender recipient)))\n (mint-result (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! mint-result (err ERR_MINT_FAILED))\n\n (ok true)\n )\n)\n\n(define-private (inner-transfer-or-mint-ft-asset\n (ft-contract )\n (ft-mint-contract )\n (amount uint)\n (recipient principal)\n (memo (optional (buff 34)))\n )\n (let (\n (call-result (contract-call? ft-contract get-balance CONTRACT_ADDRESS))\n (contract-ft-balance (unwrap! call-result (err ERR_CONTRACT_CALL_FAILED)))\n (contract-owns-enough (>= contract-ft-balance amount))\n (amount-to-transfer (if contract-owns-enough amount contract-ft-balance))\n (amount-to-mint (- amount amount-to-transfer))\n )\n\n ;; Check that the total balance between the transfer and mint is equal to the original balance\n (asserts! (is-eq amount (+ amount-to-transfer amount-to-mint)) (err ERR_IN_COMPUTATION))\n\n (and\n (> amount-to-transfer u0)\n (try! (inner-transfer-ft-asset ft-contract amount-to-transfer CONTRACT_ADDRESS recipient memo))\n )\n (and\n (> amount-to-mint u0)\n (try! (inner-mint-ft-asset ft-mint-contract amount-to-mint CONTRACT_ADDRESS recipient))\n )\n\n (ok true)\n )\n)\n\n;; A user calls this function to deposit a fungible token into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-ft-asset\n (ft-contract )\n (amount uint)\n (sender principal)\n (memo (optional (buff 34)))\n )\n (let (\n ;; Check that the asset belongs to the allowed-contracts map\n (subnet-contract-id (unwrap! (map-get? allowed-contracts (contract-of ft-contract)) (err ERR_DISALLOWED_ASSET)))\n )\n ;; Try to transfer the FT to this contract\n (asserts! (try! (inner-transfer-ft-asset ft-contract amount sender CONTRACT_ADDRESS memo)) (err ERR_TRANSFER_FAILED))\n\n (let (\n (ft-name (unwrap! (contract-call? ft-contract get-name) (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Emit a print event - the node consumes this\n (print {\n event: \"deposit-ft\",\n l1-contract-id: (as-contract ft-contract),\n ft-name: ft-name,\n ft-amount: amount,\n sender: sender,\n subnet-contract-id: subnet-contract-id,\n })\n )\n\n (ok true)\n )\n)\n\n;; This function performs validity checks related to the withdrawal and performs the withdrawal as well.\n;; Returns response\n(define-private (inner-withdraw-ft-asset\n (ft-contract )\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (memo (optional (buff 34)))\n (ft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-ft (contract-of ft-contract) amount recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts!\n (try!\n (match ft-mint-contract\n mint-contract (as-contract (inner-transfer-or-mint-ft-asset ft-contract mint-contract amount recipient memo))\n (as-contract (inner-transfer-ft-asset ft-contract amount CONTRACT_ADDRESS recipient memo))\n )\n )\n (err ERR_TRANSFER_FAILED)\n )\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n (ok true)\n )\n)\n\n;; A user can call this function to withdraw some amount of a fungible token asset from the\n;; contract and send it to a recipient.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-ft-asset\n (ft-contract )\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (memo (optional (buff 34)))\n (ft-mint-contract (optional ))\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (begin\n ;; Check that the withdraw amount is positive\n (asserts! (> amount u0) (err ERR_ATTEMPT_TO_TRANSFER_ZERO_AMOUNT))\n\n ;; Check that the asset belongs to the allowed-contracts map\n (unwrap! (map-get? allowed-contracts (contract-of ft-contract)) (err ERR_DISALLOWED_ASSET))\n\n (asserts!\n (try! (inner-withdraw-ft-asset\n ft-contract\n amount\n recipient\n withdrawal-id\n height\n memo\n ft-mint-contract\n withdrawal-root\n withdrawal-leaf-hash\n sibling-hashes))\n (err ERR_TRANSFER_FAILED)\n )\n\n (let (\n (ft-name (unwrap! (contract-call? ft-contract get-name) (err ERR_CONTRACT_CALL_FAILED)))\n )\n ;; Emit a print event\n (print {\n event: \"withdraw-ft\",\n l1-contract-id: (as-contract ft-contract),\n ft-name: ft-name,\n ft-amount: amount,\n recipient: recipient,\n })\n )\n\n (ok true)\n )\n)\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; FOR STX TRANSFERS\n\n\n;; Helper function that transfers the given amount from the specified fungible token from the given sender to the given recipient.\n;; Returns response\n(define-private (inner-transfer-stx (amount uint) (sender principal) (recipient principal))\n (let (\n (call-result (stx-transfer? amount sender recipient))\n (transfer-result (unwrap! call-result (err ERR_TRANSFER_FAILED)))\n )\n ;; Check that the transfer succeeded\n (asserts! transfer-result (err ERR_TRANSFER_FAILED))\n\n (ok true)\n )\n)\n\n;; A user calls this function to deposit STX into the contract.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (deposit-stx (amount uint) (sender principal))\n (begin\n ;; Try to transfer the STX to this contract\n (asserts! (try! (inner-transfer-stx amount sender CONTRACT_ADDRESS)) (err ERR_TRANSFER_FAILED))\n\n ;; Emit a print event - the node consumes this\n (print { event: \"deposit-stx\", sender: sender, amount: amount })\n\n (ok true)\n )\n)\n\n(define-read-only (leaf-hash-withdraw-stx\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"stx\",\n amount: amount,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n(define-read-only (leaf-hash-withdraw-nft\n (asset-contract principal)\n (nft-id uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"nft\",\n nft-id: nft-id,\n asset-contract: asset-contract,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n(define-read-only (leaf-hash-withdraw-ft\n (asset-contract principal)\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n )\n (sha512/256 (concat 0x00 (unwrap-panic (to-consensus-buff?\n {\n type: \"ft\",\n amount: amount,\n asset-contract: asset-contract,\n recipient: recipient,\n withdrawal-id: withdrawal-id,\n height: height\n })))\n )\n)\n\n;; A user calls this function to withdraw STX from this contract.\n;; In order for this withdrawal to go through, the given withdrawal must have been included\n;; in a withdrawal Merkle tree a subnet miner submitted. The user must provide the leaf\n;; hash of their withdrawal and the root hash of the specific Merkle tree their withdrawal\n;; is included in. They must also provide a list of sibling hashes. The withdraw function\n;; uses the provided hashes to ensure the requested withdrawal is valid.\n;; The function emits a print with details of this event.\n;; Returns response\n(define-public (withdraw-stx\n (amount uint)\n (recipient principal)\n (withdrawal-id uint)\n (height uint)\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (let ((hashes-are-valid (check-withdrawal-hashes withdrawal-root withdrawal-leaf-hash sibling-hashes)))\n\n (asserts! (try! hashes-are-valid) (err ERR_VALIDATION_FAILED))\n ;; check that the withdrawal request data matches the supplied leaf hash\n (asserts! (is-eq withdrawal-leaf-hash\n (leaf-hash-withdraw-stx amount recipient withdrawal-id height))\n (err ERR_VALIDATION_LEAF_FAILED))\n\n (asserts! (try! (as-contract (inner-transfer-stx amount tx-sender recipient))) (err ERR_TRANSFER_FAILED))\n\n (asserts!\n (finish-withdraw { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root })\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n ;; Emit a print event\n (print { event: \"withdraw-stx\", recipient: recipient, amount: amount })\n\n (ok true)\n )\n)\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; GENERAL WITHDRAWAL FUNCTIONS\n\n;; This function concats the two given hashes in the correct order. It also prepends the buff `0x01`, which is\n;; a tag denoting a node (versus a leaf).\n;; Returns a buff\n(define-private (create-node-hash\n (curr-hash (buff 32))\n (sibling-hash (buff 32))\n (is-sibling-left-side bool)\n )\n (let (\n (concatted-hash (if is-sibling-left-side\n (concat sibling-hash curr-hash)\n (concat curr-hash sibling-hash)\n ))\n )\n\n (concat 0x01 concatted-hash)\n )\n)\n\n;; This function hashes the curr hash with its sibling hash.\n;; Returns (buff 32)\n(define-private (hash-help\n (sibling {\n hash: (buff 32),\n is-left-side: bool,\n })\n (curr-node-hash (buff 32))\n )\n (let (\n (sibling-hash (get hash sibling))\n (is-sibling-left-side (get is-left-side sibling))\n (new-buff (create-node-hash curr-node-hash sibling-hash is-sibling-left-side))\n )\n (sha512/256 new-buff)\n )\n)\n\n;; This function checks:\n;; - That the provided withdrawal root matches a previously submitted one (passed to the function `commit-block`)\n;; - That the computed withdrawal root matches a previous valid withdrawal root\n;; - That the given withdrawal leaf hash has not been previously processed\n;; Returns response\n(define-private (check-withdrawal-hashes\n (withdrawal-root (buff 32))\n (withdrawal-leaf-hash (buff 32))\n (sibling-hashes (list 50 {\n hash: (buff 32),\n is-left-side: bool,\n }))\n )\n (begin\n ;; Check that the user submitted a valid withdrawal root\n (asserts! (is-some (map-get? withdrawal-roots-map withdrawal-root)) (err ERR_INVALID_MERKLE_ROOT))\n\n ;; Check that this withdrawal leaf has not been processed before\n (asserts!\n (is-none\n (map-get? processed-withdrawal-leaves-map\n { withdrawal-leaf-hash: withdrawal-leaf-hash, withdrawal-root-hash: withdrawal-root }))\n (err ERR_WITHDRAWAL_ALREADY_PROCESSED))\n\n (let ((calculated-withdrawal-root (fold hash-help sibling-hashes withdrawal-leaf-hash))\n (roots-match (is-eq calculated-withdrawal-root withdrawal-root)))\n (if roots-match\n (ok true)\n (err ERR_MERKLE_ROOT_DOES_NOT_MATCH))\n )\n )\n)\n\n;; This function should be called after the asset in question has been transferred.\n;; It adds the withdrawal leaf hash to a map of processed leaves. This ensures that\n;; this withdrawal leaf can't be used again to withdraw additional funds.\n;; Returns bool\n(define-private (finish-withdraw\n (withdraw-info {\n withdrawal-leaf-hash: (buff 32),\n withdrawal-root-hash: (buff 32)\n })\n )\n (map-insert processed-withdrawal-leaves-map withdraw-info true)\n)\n", + "contract_identifier": "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1" + }, + "type": "ContractDeployment" + }, + "nonce": 33, + "position": { + "index": 1 + }, + "contract_abi": { + "clarity_version": "Clarity2", + "epoch": "Epoch24", + "functions": [ + { + "access": "private", + "args": [{ "name": "tid", "type": "uint128" }], + "name": "airdrop", + "outputs": { "type": "bool" } + } + ], + "fungible_tokens": [{ "name": "MEME" }], + "maps": [ + { + "key": { + "tuple": [ + { + "name": "name", + "type": { "buffer": { "length": 48 } } + }, + { + "name": "namespace", + "type": { "buffer": { "length": 20 } } + } ] - }, - "result": "(ok true)", - "sender": "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9", - "success": true + }, + "name": "map_claimed_bns_note", + "value": "bool" + } + ], + "non_fungible_tokens": [], + "variables": [ + { + "access": "constant", + "name": "AIRDROP_COUNT_PER_MEMBER", + "type": "uint128" + } + ] + }, + "proof": null, + "raw_tx": "0x808000000004003e44ad50f99edc5e6cc5543b636284186894a008000000000000002100000000000b71b00000a84691e27fd2d46475230707a657ef7ddf6de7a4b06a1ac2049384c6474e73f85ee4ce205e0904160adaa160498df02db1782f898b5905db4d249b7025f6604c030100000000060218666169722d616d6172616e74682d7268696e6f6365726f73000005103b3b2068656c6c6f2d776f726c6420636f6e74726163740a0a28646566696e652d636f6e7374616e742073656e6465722027535a324a365a593438475631455a35563256355242394d5036365357383650594b4b51394836445052290a28646566696e652d636f6e7374616e7420726563697069656e742027534d324a365a593438475631455a35563256355242394d5036365357383650594b4b51565838583047290a0a28646566696e652d66756e6769626c652d746f6b656e206e6f76656c2d746f6b656e2d3139290a28626567696e202866742d6d696e743f206e6f76656c2d746f6b656e2d3139207531322073656e64657229290a28626567696e202866742d7472616e736665723f206e6f76656c2d746f6b656e2d31392075322073656e64657220726563697069656e7429290a0a28646566696e652d6e6f6e2d66756e6769626c652d746f6b656e2068656c6c6f2d6e66742075696e74290a28626567696e20286e66742d6d696e743f2068656c6c6f2d6e66742075312073656e64657229290a28626567696e20286e66742d6d696e743f2068656c6c6f2d6e66742075322073656e64657229290a28626567696e20286e66742d7472616e736665723f2068656c6c6f2d6e66742075312073656e64657220726563697069656e7429290a0a28646566696e652d7075626c69632028746573742d656d69742d6576656e74290a2020202028626567696e0a2020202020202020287072696e7420224576656e74212048656c6c6f20776f726c6422290a2020202020202020286f6b2075312929290a28626567696e2028746573742d656d69742d6576656e7429290a0a28646566696e652d7075626c69632028746573742d6576656e742d7479706573290a2020202028626567696e0a202020202020202028756e777261702d70616e6963202866742d6d696e743f206e6f76656c2d746f6b656e2d313920753320726563697069656e7429290a202020202020202028756e777261702d70616e696320286e66742d6d696e743f2068656c6c6f2d6e667420753220726563697069656e7429290a202020202020202028756e777261702d70616e696320287374782d7472616e736665723f207536302074782d73656e6465722027535a324a365a593438475631455a35563256355242394d5036365357383650594b4b5139483644505229290a202020202020202028756e777261702d70616e696320287374782d6275726e3f207532302074782d73656e64657229290a2020202020202020286f6b2075312929290a0a28646566696e652d6d61702073746f7265207b6b65793a202862756666203332297d207b76616c75653a202862756666203332297d290a28646566696e652d7075626c696320286765742d76616c756520286b65792028627566662033322929290a2020202028626567696e0a2020202020202020286d6174636820286d61702d6765743f2073746f7265207b6b65793a206b65797d290a202020202020202020202020656e74727920286f6b20286765742076616c756520656e74727929290a202020202020202020202020286572722030292929290a28646566696e652d7075626c696320287365742d76616c756520286b65792028627566662033322929202876616c75652028627566662033322929290a2020202028626567696e0a2020202020202020286d61702d7365742073746f7265207b6b65793a206b65797d207b76616c75653a2076616c75657d290a2020202020202020286f6b207531292929", + "receipt": { + "contract_calls_stack": [], + "events": [], + "mutated_assets_radius": [], + "mutated_contracts_radius": [ + "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1" + ] }, - "operations": [], - "transaction_identifier": { - "hash": "0x93c89ffdac77ed2ba52611563bd491f56f5d558e23d311a105663ae32bdf18e5" - } -} \ No newline at end of file + "result": "(ok true)", + "sender": "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9", + "success": true + }, + "operations": [], + "transaction_identifier": { + "hash": "0x93c89ffdac77ed2ba52611563bd491f56f5d558e23d311a105663ae32bdf18e5" + } +} diff --git a/components/chainhook-sdk/src/chainhooks/tests/mod.rs b/components/chainhook-sdk/src/chainhooks/tests/mod.rs index 021c4ae70..6fb06e65a 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/tests/mod.rs @@ -14,7 +14,7 @@ use super::{ StacksTrait, }, }; -use crate::utils::Context; +use crate::{chainhooks::stacks::serialize_stacks_payload_to_json, utils::Context}; use crate::{ chainhooks::{ tests::fixtures::{get_expected_occurrence, get_test_event_by_type}, @@ -348,6 +348,7 @@ fn test_stacks_predicates( expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: false, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -427,6 +428,7 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: false, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -447,6 +449,114 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap } } +#[test] +fn verify_optional_addition_of_contract_abi() { + // "mine" two blocks + // - one contract deploy (which should have a contract abi) and + // - one contract call (which should not) + let new_blocks = vec![ + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_deployment(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + StacksBlockUpdate { + block: fixtures::build_stacks_testnet_block_with_contract_call(), + parent_microblocks_to_apply: vec![], + parent_microblocks_to_rollback: vec![], + }, + ]; + let event: StacksChainEvent = + StacksChainEvent::ChainUpdatedWithBlocks(StacksChainUpdatedWithBlocksData { + new_blocks, + confirmed_blocks: vec![], + }); + let mut contract_deploy_chainhook = StacksChainhookSpecification { + uuid: "contract-deploy".to_string(), + owner_uuid: None, + name: "".to_string(), + network: StacksNetwork::Testnet, + version: 1, + blocks: None, + start_block: None, + end_block: None, + expire_after_occurrence: None, + capture_all_events: None, + decode_clarity_values: None, + include_contract_abi: true, + predicate: StacksPredicate::ContractDeployment( + StacksContractDeploymentPredicate::Deployer("*".to_string()), + ), + action: HookAction::Noop, + enabled: true, + expired_at: None, + }; + let contract_call_chainhook = StacksChainhookSpecification { + uuid: "contract-call".to_string(), + owner_uuid: None, + name: "".to_string(), + network: StacksNetwork::Testnet, + version: 1, + blocks: None, + start_block: None, + end_block: None, + expire_after_occurrence: None, + capture_all_events: None, + decode_clarity_values: None, + include_contract_abi: true, + predicate: StacksPredicate::ContractCall(StacksContractCallBasedPredicate { + contract_identifier: "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1".to_string(), + method: "commit-block".to_string(), + }), + action: HookAction::Noop, + enabled: true, + expired_at: None, + }; + + let predicates = vec![&contract_deploy_chainhook, &contract_call_chainhook]; + let (triggered, _blocks, _) = + evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); + assert_eq!(triggered.len(), 2); + + for t in triggered.into_iter() { + let result = serialize_stacks_payload_to_json(t, &HashMap::new(), &Context::empty()); + let result = result.as_object().unwrap(); + let uuid = result.get("chainhook").unwrap().get("uuid").unwrap(); + let apply_blocks = result.get("apply").unwrap(); + for block in apply_blocks.as_array().unwrap() { + let transactions = block.get("transactions").unwrap(); + for transaction in transactions.as_array().unwrap() { + let contract_abi = transaction.get("metadata").unwrap().get("contract_abi"); + if uuid == "contract-call" { + assert_eq!(contract_abi, None); + } else if uuid == "contract-deploy" { + assert!(contract_abi.is_some()) + } else { + unreachable!() + } + } + } + } + contract_deploy_chainhook.include_contract_abi = false; + let predicates = vec![&contract_deploy_chainhook, &contract_call_chainhook]; + let (triggered, _blocks, _) = + evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); + assert_eq!(triggered.len(), 2); + + for t in triggered.into_iter() { + let result = serialize_stacks_payload_to_json(t, &HashMap::new(), &Context::empty()); + let result = result.as_object().unwrap(); + let apply_blocks = result.get("apply").unwrap(); + for block in apply_blocks.as_array().unwrap() { + let transactions = block.get("transactions").unwrap(); + for transaction in transactions.as_array().unwrap() { + let contract_abi = transaction.get("metadata").unwrap().get("contract_abi"); + assert_eq!(contract_abi, None); + } + } + } +} + #[test_case( StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1".to_string(), @@ -512,6 +622,7 @@ fn test_stacks_predicate_contract_call(predicate: StacksPredicate, expected_appl expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: false, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -546,6 +657,7 @@ fn test_stacks_hook_action_noop() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, + include_contract_abi: false, predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), )), @@ -603,6 +715,7 @@ fn test_stacks_hook_action_file_append() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: Some(true), + include_contract_abi: false, predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), )), diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 463615520..f753b4869 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -410,6 +410,7 @@ impl StacksChainhookFullSpecification { capture_all_events: spec.capture_all_events, decode_clarity_values: spec.decode_clarity_values, expire_after_occurrence: spec.expire_after_occurrence, + include_contract_abi: spec.include_contract_abi.unwrap_or(false), predicate: spec.predicate, action: spec.action, enabled: false, @@ -432,6 +433,8 @@ pub struct StacksChainhookNetworkSpecification { pub capture_all_events: Option, #[serde(skip_serializing_if = "Option::is_none")] pub decode_clarity_values: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub include_contract_abi: Option, #[serde(rename = "if_this")] pub predicate: StacksPredicate, #[serde(rename = "then_that")] @@ -732,6 +735,7 @@ pub struct StacksChainhookSpecification { pub capture_all_events: Option, #[serde(skip_serializing_if = "Option::is_none")] pub decode_clarity_values: Option, + pub include_contract_abi: bool, #[serde(rename = "predicate")] pub predicate: StacksPredicate, pub action: HookAction, diff --git a/components/chainhook-sdk/src/indexer/stacks/mod.rs b/components/chainhook-sdk/src/indexer/stacks/mod.rs index 01f3318ae..49025e621 100644 --- a/components/chainhook-sdk/src/indexer/stacks/mod.rs +++ b/components/chainhook-sdk/src/indexer/stacks/mod.rs @@ -76,6 +76,7 @@ pub struct NewTransaction { pub raw_result: String, pub raw_tx: String, pub execution_cost: Option, + pub contract_abi: Option, } #[derive(Deserialize, Debug)] @@ -89,6 +90,7 @@ pub struct NewMicroblockTransaction { pub microblock_sequence: usize, pub microblock_hash: String, pub microblock_parent_hash: String, + pub contract_abi: Option, } #[derive(Debug, Deserialize, Serialize)] @@ -311,6 +313,7 @@ pub fn standardize_stacks_block( description, position: StacksTransactionPosition::anchor_block(tx.tx_index), proof: None, + contract_abi: tx.contract_abi.clone(), }, }); } @@ -452,6 +455,7 @@ pub fn standardize_stacks_microblock_trail( tx.tx_index, ), proof: None, + contract_abi: tx.contract_abi.clone(), }, }; diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/transactions.rs b/components/chainhook-sdk/src/indexer/tests/helpers/transactions.rs index 24b7fe9e8..505c9b9ad 100644 --- a/components/chainhook-sdk/src/indexer/tests/helpers/transactions.rs +++ b/components/chainhook-sdk/src/indexer/tests/helpers/transactions.rs @@ -64,6 +64,7 @@ pub fn generate_test_tx_stacks_contract_call( sponsor: None, position: chainhook_types::StacksTransactionPosition::anchor_block(0), proof: None, + contract_abi: None, }, } } diff --git a/components/chainhook-sdk/src/observer/tests/mod.rs b/components/chainhook-sdk/src/observer/tests/mod.rs index 1efea079d..2b5910887 100644 --- a/components/chainhook-sdk/src/observer/tests/mod.rs +++ b/components/chainhook-sdk/src/observer/tests/mod.rs @@ -67,6 +67,7 @@ fn stacks_chainhook_contract_call( expire_after_occurrence, capture_all_events: None, decode_clarity_values: Some(true), + include_contract_abi: None, predicate: StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: contract_identifier.to_string(), method: method.to_string(), diff --git a/components/chainhook-types-rs/src/contract_interface.rs b/components/chainhook-types-rs/src/contract_interface.rs new file mode 100644 index 000000000..07aeb827b --- /dev/null +++ b/components/chainhook-types-rs/src/contract_interface.rs @@ -0,0 +1,171 @@ +// NOTE: This module is a very slightly simplified version of the +// `clarity-vm` repository's [ContractInterface](https://github.com/stacks-network/stacks-blockchain/blob/eca1cfe81f0c0989ebd3e53c32e3e5d70ed83757/clarity/src/vm/analysis/contract_interface_builder/mod.rs#L368) type. +// We've copied it here rather than using `clarity-vm` as a dependency to avoid circular dependencies. + +use std::{fmt, str::FromStr}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterface { + pub functions: Vec, + pub variables: Vec, + pub maps: Vec, + pub fungible_tokens: Vec, + pub non_fungible_tokens: Vec, + pub epoch: String, + pub clarity_version: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceFunction { + pub name: String, + pub access: ContractInterfaceFunctionAccess, + pub args: Vec, + pub outputs: ContractInterfaceFunctionOutput, +} +#[allow(non_camel_case_types)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ContractInterfaceFunctionAccess { + private, + public, + read_only, +} +#[allow(non_camel_case_types)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ContractInterfaceVariableAccess { + constant, + variable, +} +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceFunctionArg { + pub name: String, + #[serde(rename = "type")] + pub type_f: ContractInterfaceAtomType, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceFunctionOutput { + #[serde(rename = "type")] + pub type_f: ContractInterfaceAtomType, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceVariable { + pub name: String, + #[serde(rename = "type")] + pub type_f: ContractInterfaceAtomType, + pub access: ContractInterfaceVariableAccess, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceMap { + pub name: String, + pub key: ContractInterfaceAtomType, + pub value: ContractInterfaceAtomType, +} + +#[allow(non_camel_case_types)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum ContractInterfaceAtomType { + none, + int128, + uint128, + bool, + principal, + buffer { + length: u32, + }, + #[serde(rename = "string-utf8")] + string_utf8 { + length: u32, + }, + #[serde(rename = "string-ascii")] + string_ascii { + length: u32, + }, + tuple(Vec), + optional(Box), + response { + ok: Box, + error: Box, + }, + list { + #[serde(rename = "type")] + type_f: Box, + length: u32, + }, + trait_reference, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceTupleEntryType { + pub name: String, + #[serde(rename = "type")] + pub type_f: ContractInterfaceAtomType, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceFungibleTokens { + pub name: String, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct ContractInterfaceNonFungibleTokens { + pub name: String, + #[serde(rename = "type")] + pub type_f: ContractInterfaceAtomType, +} +#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, PartialOrd)] +pub enum ClarityVersion { + Clarity1, + Clarity2, +} + +impl fmt::Display for ClarityVersion { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ClarityVersion::Clarity1 => write!(f, "Clarity 1"), + ClarityVersion::Clarity2 => write!(f, "Clarity 2"), + } + } +} + +impl FromStr for ClarityVersion { + type Err = String; + fn from_str(version: &str) -> Result { + let s = version.to_string().to_lowercase(); + if s == "clarity1" { + Ok(ClarityVersion::Clarity1) + } else if s == "clarity2" { + Ok(ClarityVersion::Clarity2) + } else { + Err(format!( + "Invalid clarity version. Valid versions are: Clarity1, Clarity2." + )) + } + } +} +#[repr(u32)] +#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Ord, Hash, Copy, Serialize, Deserialize)] +pub enum StacksEpochId { + Epoch10 = 0x01000, + Epoch20 = 0x02000, + Epoch2_05 = 0x02005, + Epoch21 = 0x0200a, + Epoch22 = 0x0200f, + Epoch23 = 0x02014, + Epoch24 = 0x02019, +} + +impl std::fmt::Display for StacksEpochId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + StacksEpochId::Epoch10 => write!(f, "1.0"), + StacksEpochId::Epoch20 => write!(f, "2.0"), + StacksEpochId::Epoch2_05 => write!(f, "2.05"), + StacksEpochId::Epoch21 => write!(f, "2.1"), + StacksEpochId::Epoch22 => write!(f, "2.2"), + StacksEpochId::Epoch23 => write!(f, "2.3"), + StacksEpochId::Epoch24 => write!(f, "2.4"), + } + } +} diff --git a/components/chainhook-types-rs/src/lib.rs b/components/chainhook-types-rs/src/lib.rs index b4baf2a3d..cd8ef7b02 100644 --- a/components/chainhook-types-rs/src/lib.rs +++ b/components/chainhook-types-rs/src/lib.rs @@ -4,10 +4,12 @@ extern crate serde; extern crate serde_derive; pub mod bitcoin; +mod contract_interface; mod events; mod processors; mod rosetta; +pub use contract_interface::*; pub use events::*; pub use processors::*; pub use rosetta::*; diff --git a/components/chainhook-types-rs/src/rosetta.rs b/components/chainhook-types-rs/src/rosetta.rs index 39ba9c005..543994e17 100644 --- a/components/chainhook-types-rs/src/rosetta.rs +++ b/components/chainhook-types-rs/src/rosetta.rs @@ -1,4 +1,5 @@ use super::bitcoin::{TxIn, TxOut}; +use crate::contract_interface::ContractInterface; use crate::events::*; use schemars::JsonSchema; use std::cmp::Ordering; @@ -219,6 +220,8 @@ pub struct StacksTransactionMetadata { pub execution_cost: Option, pub position: StacksTransactionPosition, pub proof: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub contract_abi: Option, } /// TODO diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md index 0a5b5c506..f95fd213f 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-stacks.md @@ -225,9 +225,12 @@ Following additional configurations can be used to improve the performance of ch - Stop evaluating chainhook after a given number of occurrences found: `"expire_after_occurrence": 1` -- Include decoded clarity values in the payload +- Include decoded clarity values in the payload: `"decode_clarity_values": true` +- Include the contract ABI for transactions that deploy contracts: +`"include_contract_abi": true` + ## Example predicate definition to print events Retrieve and HTTP Post to `http://localhost:3000/api/v1/wrapBtc` the first five transactions interacting with ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.monkey-sip09, emitting print events containing the word 'vault'. From 33c275bd4b851814f0e0226463466418e646af4d Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Wed, 6 Sep 2023 10:29:20 +0200 Subject: [PATCH 55/99] fix: op_return predicate evaluation --- .../src/chainhooks/bitcoin/mod.rs | 88 ++++++++++++++----- .../src/chainhooks/bitcoin/tests.rs | 87 ++++++++++++++++++ 2 files changed, 151 insertions(+), 24 deletions(-) create mode 100644 components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index d4b411e17..dd17c6b07 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -18,6 +18,8 @@ use std::str::FromStr; use reqwest::RequestBuilder; +use hex::FromHex; + pub struct BitcoinTriggerChainhook<'a> { pub chainhook: &'a BitcoinChainhookSpecification, pub apply: Vec<(Vec<&'a BitcoinTransactionData>, &'a BitcoinBlockData)>, @@ -301,6 +303,25 @@ pub fn handle_bitcoin_hook_action<'a>( } } +struct OpReturn(String); +impl OpReturn { + fn from_string(hex: &String) -> Result { + // Remove the `0x` prefix if present so that we can call from_hex without errors. + let hex = hex.strip_prefix("0x").unwrap_or(hex); + + // Parse the hex bytes. + let bytes = Vec::::from_hex(hex).unwrap(); + match bytes.as_slice() { + // An OpReturn is composed by: + // - OP_RETURN 0x6a + // - Data length (ignored) + // - The data + [0x6a, _, rest @ ..] => Ok(hex::encode(rest)), + _ => Err(String::from("not an OP_RETURN")), + } + } +} + impl BitcoinPredicateType { pub fn evaluate_transaction_predicate( &self, @@ -313,32 +334,48 @@ impl BitcoinPredicateType { BitcoinPredicateType::Txid(ExactMatchingRule::Equals(txid)) => { tx.transaction_identifier.hash.eq(txid) } - BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(MatchingRule::Equals( - hex_bytes, - ))) => { - for output in tx.metadata.outputs.iter() { - if output.script_pubkey.eq(hex_bytes) { - return true; - } - } - false - } - BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(MatchingRule::StartsWith( - hex_bytes, - ))) => { + BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(rule)) => { for output in tx.metadata.outputs.iter() { - if output.script_pubkey.starts_with(hex_bytes) { - return true; + // opret contains the op_return data section prefixed with `0x`. + let opret = match OpReturn::from_string(&output.script_pubkey) { + Ok(op) => op, + Err(_) => continue, + }; + + // encoded_pattern takes a predicate pattern and return its lowercase hex + // representation. + fn encoded_pattern(pattern: &str) -> String { + // If the pattern starts with 0x, return it in lowercase and without the 0x + // prefix. + if pattern.starts_with("0x") { + return pattern + .strip_prefix("0x") + .unwrap() + .to_lowercase() + .to_string(); + } + + // In this case it should be trated as ASCII so let's return its hex + // representation. + hex::encode(pattern) } - } - false - } - BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(MatchingRule::EndsWith( - hex_bytes, - ))) => { - for output in tx.metadata.outputs.iter() { - if output.script_pubkey.ends_with(hex_bytes) { - return true; + + match rule { + MatchingRule::StartsWith(pattern) => { + if opret.starts_with(&encoded_pattern(pattern)) { + return true; + } + } + MatchingRule::EndsWith(pattern) => { + if opret.ends_with(&encoded_pattern(pattern)) { + return true; + } + } + MatchingRule::Equals(pattern) => { + if opret.eq(&encoded_pattern(pattern)) { + return true; + } + } } } false @@ -452,3 +489,6 @@ impl BitcoinPredicateType { } } } + +#[cfg(test)] +pub mod tests; diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs new file mode 100644 index 000000000..27698a6de --- /dev/null +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs @@ -0,0 +1,87 @@ +use super::super::types::MatchingRule; +use super::*; +use crate::types::BitcoinTransactionMetadata; +use chainhook_types::bitcoin::TxOut; + +use test_case::test_case; + +#[test_case( + "0x6affAAAA", + MatchingRule::Equals(String::from("0xAAAA")), + true; + "OpReturn: Equals matches Hex value" +)] +#[test_case( + "0x60ff0000", + MatchingRule::Equals(String::from("0x0000")), + false; + "OpReturn: Invalid OP_RETURN opcode" +)] +#[test_case( + "0x6aff012345", + MatchingRule::Equals(String::from("0x0000")), + false; + "OpReturn: Equals does not match Hex value" +)] +#[test_case( + "0x6aff68656C6C6F", + MatchingRule::Equals(String::from("hello")), + true; + "OpReturn: Equals matches ASCII value" +)] +#[test_case( + "0x6affAA0000", + MatchingRule::StartsWith(String::from("0xAA")), + true; + "OpReturn: StartsWith matches Hex value" +)] +#[test_case( + "0x6aff585858", // 0x585858 => XXX + MatchingRule::StartsWith(String::from("X")), + true; + "OpReturn: StartsWith matches ASCII value" +)] +#[test_case( + "0x6aff0000AA", + MatchingRule::EndsWith(String::from("0xAA")), + true; + "OpReturn: EndsWith matches Hex value" +)] +#[test_case( + "0x6aff000058", + MatchingRule::EndsWith(String::from("X")), + true; + "OpReturn: EndsWith matches ASCII value" +)] + +fn test_script_pubkey_evaluation(script_pubkey: &str, rule: MatchingRule, matches: bool) { + let predicate = BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(rule)); + + let outputs = vec![TxOut { + value: 0, + script_pubkey: String::from(script_pubkey), + }]; + + let tx = BitcoinTransactionData { + transaction_identifier: TransactionIdentifier { + hash: String::from(""), + }, + operations: vec![], + metadata: BitcoinTransactionMetadata { + fee: 0, + proof: None, + inputs: vec![], + stacks_operations: vec![], + ordinal_operations: vec![], + + outputs, + }, + }; + + let ctx = Context { + logger: None, + tracer: false, + }; + + assert_eq!(matches, predicate.evaluate_transaction_predicate(&tx, &ctx),); +} From 51eb3073bf6f5bdc2a76dade81cf50b13e8e0740 Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Wed, 20 Sep 2023 19:00:30 +0200 Subject: [PATCH 56/99] update OP_RETURN how-to --- .../how-to-use-chainhooks-with-bitcoin.md | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md b/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md index 338cc5c0f..1d96f21ea 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md @@ -1,6 +1,4 @@ ---- -title: Use Chainhooks with Bitcoin ---- +# Use Chainhooks with Bitcoin The following guide helps you define predicates to use Chainhook with Bitcoin. The predicates are specified based on `if-this`, `then-that` constructs. @@ -23,54 +21,58 @@ Get any transaction matching a given transaction ID (txid): } ``` -Get any transaction, including: +Get any transaction matching a given `OP_RETURN` payload: +Example: Given the following `script_pubkey` : -- OP_RETURN output starting with a set of characters. - - `starts_with` mandatory argument admits: - - ASCII string type. Example: `X2[` - - hex encoded bytes. Example: `0x589403` +``` +OP_RETURN +PUSHDATA(0x03) +0x616263 +``` + +or `0x6a03616263` in hex, the following predicates will match the transaction above. + +Get any transaction, where its `OP_RETURN` payload starts with a set of characters: +- `starts_with` mandatory argument admits: + - ASCII string type. Example: `ab` + - hex encoded bytes. Example: `0x6162` ```json { "if_this": { "scope": "outputs", "op_return": { - "starts_with": "X2[" + "starts_with": "ab" } } } ``` - -`op_return` is used to find blocks starting, ending, or equivalent to a specific string from the list of output blocks. - -Get any transaction, including an OP_RETURN output matching the sequence of bytes specified: - +Get any transaction, where its `OP_RETURN` payload is equals to set of characters: - `equals` mandatory argument admits: - - hex encoded bytes. Example: `0x69bd04208265aca9424d0337dac7d9e84371a2c91ece1891d67d3554bd9fdbe60afc6924d4b0773d90000006700010000006600012` + - ASCII string type: Example `abc` + - hex encoded bytes. Example: `0x616263` ```json { "if_this": { "scope": "outputs", "op_return": { - "equals": "0x69bd04208265aca9424d0337dac7d9e84371a2c91ece1891d67d3554bd9fdbe60afc6924d4b0773d90000006700010000006600012" + "equals": "0x616263" } } } ``` - -Get any transaction, including an OP_RETURN output ending with a set of characters: - +Get any transaction, where its `OP_RETURN` payload ends with a set of characters: - `ends_with` mandatory argument admits: - - ASCII string type. Example: `X2[` - - hex encoded bytes. Example: `0x76a914000000000000000000000000000000000000000088ac` + - ASCII string type. Example: `bc` + - hex encoded bytes. Example: `0x6263` ```json { "if_this": { "scope": "outputs", "op_return": { - "ends_with": "0x76a914000000000000000000000000000000000000000088ac" + "ends_with": "0x6263" } } } From 04249e33c7fc1c33911cfb2a05b39e83bd2ae648 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 25 Sep 2023 13:08:47 -0400 Subject: [PATCH 57/99] chore: update predicate status format for easier parsing (#420) ### Description Previously, a serialized `PredicateStatus` would have the format: ```JSON { "scanning": { "last_evaluated_block": ... } ``` where the predicate status type is the key that points to the data. This PR changes this format to be: ```JSON { "type": "scanning", "info": { "last_evaluated_block": ... } } ``` ### Checklist - [x] All tests pass --- components/chainhook-cli/src/service/mod.rs | 31 +++++++++++++-------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index cc641b951..fe487f123 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -535,6 +535,7 @@ impl Service { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] +#[serde(tag = "type", content = "info")] /// A high-level view of how `PredicateStatus` is used/updated can be seen here: docs/images/predicate-status-flowchart/PredicateStatusFlowchart.png. pub enum PredicateStatus { Scanning(ScanningData), @@ -546,18 +547,21 @@ pub enum PredicateStatus { } #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] +// note: last_occurrence (and other time-based fields on the status structs) originally were +// of type u128. serde can't handle deserializing u128s when using an adjacently tagged enum, +// so we're having to convert to a string. serde issue: https://github.com/serde-rs/json/issues/740 pub struct ScanningData { pub number_of_blocks_to_scan: u64, pub number_of_blocks_evaluated: u64, pub number_of_times_triggered: u64, - pub last_occurrence: u128, + pub last_occurrence: String, pub last_evaluated_block_height: u64, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct StreamingData { - pub last_occurrence: u128, - pub last_evaluation: u128, + pub last_occurrence: String, + pub last_evaluation: String, pub number_of_times_triggered: u64, pub number_of_blocks_evaluated: u64, pub last_evaluated_block_height: u64, @@ -567,7 +571,7 @@ pub struct StreamingData { pub struct ExpiredData { pub number_of_blocks_evaluated: u64, pub number_of_times_triggered: u64, - pub last_occurrence: u128, + pub last_occurrence: String, pub last_evaluated_block_height: u64, pub expired_at_block_height: u64, } @@ -663,7 +667,8 @@ fn set_predicate_streaming_status( let now_ms = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Could not get current time in ms") - .as_millis(); + .as_millis() + .to_string(); let ( last_occurrence, number_of_blocks_evaluated, @@ -715,7 +720,7 @@ fn set_predicate_streaming_status( unreachable!("unreachable predicate status: {:?}", status) } }, - None => (0, 0, 0, 0), + None => (format!("0"), 0, 0, 0), } }; let ( @@ -728,7 +733,7 @@ fn set_predicate_streaming_status( last_triggered_height, triggered_count, } => ( - now_ms, + now_ms.clone(), number_of_times_triggered + triggered_count, number_of_blocks_evaluated + triggered_count, last_triggered_height, @@ -779,7 +784,8 @@ pub fn set_predicate_scanning_status( let now_ms = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Could not get current time in ms") - .as_millis(); + .as_millis() + .to_string(); let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); let last_occurrence = match current_status { Some(status) => match status { @@ -808,14 +814,14 @@ pub fn set_predicate_scanning_status( if number_of_times_triggered > 0 { now_ms } else { - 0 + format!("0") } } PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { unreachable!("unreachable predicate status: {:?}", status) } }, - None => 0, + None => format!("0"), }; update_predicate_status( @@ -864,7 +870,7 @@ pub fn set_unconfirmed_expiration_status( last_occurrence, last_evaluated_block_height, ), - PredicateStatus::New => (0, 0, 0, 0), + PredicateStatus::New => (0, 0, format!("0"), 0), PredicateStatus::Streaming(StreamingData { last_occurrence, last_evaluation: _, @@ -900,7 +906,7 @@ pub fn set_unconfirmed_expiration_status( return; } }, - None => (0, 0, 0, 0), + None => (0, 0, format!("0"), 0), }; update_predicate_status( predicate_key, @@ -1032,6 +1038,7 @@ pub fn update_predicate_status( ctx: &Context, ) { let serialized_status = json!(status).to_string(); + println!("serialized predicate status {serialized_status}"); if let Err(e) = predicates_db_conn.hset::<_, _, _, ()>(&predicate_key, "status", &serialized_status) { From c0001ae95f3e869ff6cff23daf11beb0ed54a91b Mon Sep 17 00:00:00 2001 From: saralab <264896+saralab@users.noreply.github.com> Date: Mon, 2 Oct 2023 21:46:54 -0400 Subject: [PATCH 58/99] Update faq.md FAQ's -> FAQs --- docs/faq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index f97dfe3a0..778b4203f 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,8 +1,8 @@ --- -title: FAQ's +title: FAQs --- -# FAQ's +# FAQs #### **Can Chainhook target both Bitcoin and Stacks?** From 1e606edf4ee8b676422a6ccadb6f300aae829dae Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Tue, 3 Oct 2023 12:24:05 -0400 Subject: [PATCH 59/99] test: improve coverage (#418) Fixes some bugs found along the way --- ### Checklist - [x] All tests pass - [x] Tests added in this PR (if applicable) Test coverage before: 47.07% Test coverage after: 63.30% --- .gitignore | 3 +- .../chainhook-cli/benches/codec/clarity.rs | 27 -- components/chainhook-cli/benches/codec/hex.rs | 397 ------------------ .../chainhook-cli/benches/storage/redis.rs | 17 - .../chainhook-cli/benches/storage/rocksdb.rs | 16 - .../chainhook-cli/benches/storage/sqlite.rs | 16 - components/chainhook-cli/src/archive/mod.rs | 3 + .../tests/fixtures/stacks_blocks.tsv.gz | Bin 0 -> 1306 bytes .../chainhook-cli/src/archive/tests/mod.rs | 84 ++++ components/chainhook-cli/src/config/file.rs | 29 +- .../chainhook-cli/src/config/generator.rs | 5 +- components/chainhook-cli/src/config/mod.rs | 73 +--- .../tests/fixtures/devnet_chainhook.toml | 35 ++ .../tests/fixtures/local_tsv_chainhook.toml | 35 ++ .../tests/fixtures/mainnet_chainhook.toml | 35 ++ .../tests/fixtures/testnet_chainhook.toml | 35 ++ .../tests/fixtures/unsupported_chainhook.toml | 35 ++ .../chainhook-cli/src/config/tests/mod.rs | 140 ++++++ components/chainhook-cli/src/scan/bitcoin.rs | 2 +- components/chainhook-cli/src/service/mod.rs | 6 +- .../service/tests/helpers/mock_bitcoin_rpc.rs | 210 +++++++-- .../src/service/tests/helpers/mock_service.rs | 145 +++---- .../service/tests/helpers/mock_stacks_node.rs | 267 +++++++++++- .../src/service/tests/helpers/mod.rs | 8 + .../chainhook-cli/src/service/tests/mod.rs | 376 ++++++++++++++++- .../src/service/tests/observer_tests.rs | 164 ++++++++ components/chainhook-cli/src/storage/mod.rs | 22 - .../chainhook-sdk/src/chainhooks/types.rs | 47 --- .../chainhook-sdk/src/indexer/bitcoin/mod.rs | 148 ------- components/chainhook-sdk/src/indexer/mod.rs | 2 +- .../chainhook-sdk/src/indexer/stacks/tests.rs | 128 +++++- .../src/indexer/tests/helpers/mod.rs | 1 + .../indexer/tests/helpers/stacks_events.rs | 118 ++++++ components/chainhook-sdk/src/observer/mod.rs | 67 +-- components/chainhook-types-rs/src/rosetta.rs | 4 +- docs/chainhook-openapi.json | 4 + 36 files changed, 1717 insertions(+), 987 deletions(-) delete mode 100644 components/chainhook-cli/benches/codec/clarity.rs delete mode 100644 components/chainhook-cli/benches/codec/hex.rs delete mode 100644 components/chainhook-cli/benches/storage/redis.rs delete mode 100644 components/chainhook-cli/benches/storage/rocksdb.rs delete mode 100644 components/chainhook-cli/benches/storage/sqlite.rs create mode 100644 components/chainhook-cli/src/archive/tests/fixtures/stacks_blocks.tsv.gz create mode 100644 components/chainhook-cli/src/archive/tests/mod.rs create mode 100644 components/chainhook-cli/src/config/tests/fixtures/devnet_chainhook.toml create mode 100644 components/chainhook-cli/src/config/tests/fixtures/local_tsv_chainhook.toml create mode 100644 components/chainhook-cli/src/config/tests/fixtures/mainnet_chainhook.toml create mode 100644 components/chainhook-cli/src/config/tests/fixtures/testnet_chainhook.toml create mode 100644 components/chainhook-cli/src/config/tests/fixtures/unsupported_chainhook.toml create mode 100644 components/chainhook-cli/src/config/tests/mod.rs create mode 100644 components/chainhook-cli/src/service/tests/observer_tests.rs create mode 100644 components/chainhook-sdk/src/indexer/tests/helpers/stacks_events.rs diff --git a/.gitignore b/.gitignore index 9f6f049ca..d63cbe1d0 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ components/chainhook-types-js/dist *.redb cache/ -components/chainhook-cli/src/service/tests/fixtures/tmp \ No newline at end of file +components/chainhook-cli/src/service/tests/fixtures/tmp +components/chainhook-cli/src/archive/tests/fixtures/tmp \ No newline at end of file diff --git a/components/chainhook-cli/benches/codec/clarity.rs b/components/chainhook-cli/benches/codec/clarity.rs deleted file mode 100644 index 8f2397379..000000000 --- a/components/chainhook-cli/benches/codec/clarity.rs +++ /dev/null @@ -1,27 +0,0 @@ -use clarity_repl::clarity::codec::StacksString; -use clarity_repl::clarity::ClarityName; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use hex::{decode, encode}; - -#[inline] -fn canonical_is_clarity_variable() { - let function_name = ClarityName::try_from("my-method-name").unwrap(); - StacksString::from(function_name.clone()).is_clarity_variable(); -} - -#[inline] -fn proposed_is_clarity_variable() { - let function_name = ClarityName::try_from("my-method-name").unwrap(); -} - -pub fn criterion_benchmark(c: &mut Criterion) { - c.bench_function("canonical_is_clarity_variable ", |b| { - b.iter(|| canonical_is_clarity_variable()) - }); - c.bench_function("proposed_is_clarity_variable ", |b| { - b.iter(|| proposed_is_clarity_variable()) - }); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); diff --git a/components/chainhook-cli/benches/codec/hex.rs b/components/chainhook-cli/benches/codec/hex.rs deleted file mode 100644 index 8b5fb30c3..000000000 --- a/components/chainhook-cli/benches/codec/hex.rs +++ /dev/null @@ -1,397 +0,0 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use hex::{decode, encode}; - -#[inline] -fn decode_hex_str_stacks(input: &str) -> Vec { - hex_bytes(input).unwrap() -} - -#[inline] -fn encode_hex_str_stacks() -> String { - hex::encode(&[ - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x04, - 0x00, - 0xa4, - 0x68, - 0xe7, - 0x2d, - 0xf6, - 0x75, - 0x43, - 0x87, - 0x20, - 0x98, - 0x27, - 0x32, - 0x7b, - 0x98, - 0x9f, - 0x4a, - 0x99, - 0x54, - 0x2a, - 0x69, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x01, - 0x23, - 0x1c, - 0x21, - 0x39, - 0x49, - 0x45, - 0x53, - 0x17, - 0xd1, - 0x5f, - 0xf2, - 0x5d, - 0xfd, - 0x7a, - 0xd9, - 0xbc, - 0x04, - 0x26, - 0xcf, - 0xfa, - 0x5c, - 0x6f, - 0x5b, - 0xe4, - 0x6e, - 0x79, - 0xfa, - 0x1e, - 0x18, - 0x2b, - 0x61, - 0x45, - 0x18, - 0x0c, - 0x1c, - 0x13, - 0x5d, - 0x6c, - 0xcc, - 0xfc, - 0xc4, - 0x9e, - 0x85, - 0xcb, - 0x82, - 0x5e, - 0x61, - 0x52, - 0x28, - 0xda, - 0xf2, - 0xd1, - 0x66, - 0x3e, - 0x49, - 0xd7, - 0x0c, - 0xd5, - 0xd0, - 0xe1, - 0x96, - 0xd1, - 0x26, - 0xc0, - 0x03, - 0x02, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x16, - 0x7b, - 0x2d, - 0xd1, - 0xf0, - 0xd4, - 0x7f, - 0x59, - 0x67, - 0x21, - 0xc2, - 0x33, - 0xfd, - 0x9b, - 0x2e, - 0x99, - 0x19, - 0xac, - 0x91, - 0x28, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x1b, - 0x5e, - 0x48, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 - ]) -} - - -#[inline] -fn decode_hex_str_crate(input: &str) -> Vec { - decode(input).unwrap() -} - -#[inline] -fn encode_hex_str_crate() -> String { - encode(&[ - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x04, - 0x00, - 0xa4, - 0x68, - 0xe7, - 0x2d, - 0xf6, - 0x75, - 0x43, - 0x87, - 0x20, - 0x98, - 0x27, - 0x32, - 0x7b, - 0x98, - 0x9f, - 0x4a, - 0x99, - 0x54, - 0x2a, - 0x69, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x77, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x00, - 0x01, - 0x23, - 0x1c, - 0x21, - 0x39, - 0x49, - 0x45, - 0x53, - 0x17, - 0xd1, - 0x5f, - 0xf2, - 0x5d, - 0xfd, - 0x7a, - 0xd9, - 0xbc, - 0x04, - 0x26, - 0xcf, - 0xfa, - 0x5c, - 0x6f, - 0x5b, - 0xe4, - 0x6e, - 0x79, - 0xfa, - 0x1e, - 0x18, - 0x2b, - 0x61, - 0x45, - 0x18, - 0x0c, - 0x1c, - 0x13, - 0x5d, - 0x6c, - 0xcc, - 0xfc, - 0xc4, - 0x9e, - 0x85, - 0xcb, - 0x82, - 0x5e, - 0x61, - 0x52, - 0x28, - 0xda, - 0xf2, - 0xd1, - 0x66, - 0x3e, - 0x49, - 0xd7, - 0x0c, - 0xd5, - 0xd0, - 0xe1, - 0x96, - 0xd1, - 0x26, - 0xc0, - 0x03, - 0x02, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - 0x16, - 0x7b, - 0x2d, - 0xd1, - 0xf0, - 0xd4, - 0x7f, - 0x59, - 0x67, - 0x21, - 0xc2, - 0x33, - 0xfd, - 0x9b, - 0x2e, - 0x99, - 0x19, - 0xac, - 0x91, - 0x28, - 0x8a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x0c, - 0x1b, - 0x5e, - 0x48, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 - ]) -} - - -pub fn criterion_benchmark(c: &mut Criterion) { - c.bench_function("decode_hex_str ('hex_bytes' from stacks) <360>", |b| b.iter(|| decode_hex_str_stacks(black_box("00000000010400a468e72df6754387209827327b989f4a99542a69000000000000007700000000000000b40001231c213949455317d15ff25dfd7ad9bc0426cffa5c6f5be46e79fa1e182b6145180c1c135d6cccfcc49e85cb825e615228daf2d1663e49d70cd5d0e196d126c00302000000000005167b2dd1f0d47f596721c233fd9b2e9919ac91288a000000000c1b5e4800000000000000000000000000000000000000000000000000000000000000000000")))); - c.bench_function("decode_hex_str (function from crate 'hex') <360>", |b| b.iter(|| decode_hex_str_crate(black_box("00000000010400a468e72df6754387209827327b989f4a99542a69000000000000007700000000000000b40001231c213949455317d15ff25dfd7ad9bc0426cffa5c6f5be46e79fa1e182b6145180c1c135d6cccfcc49e85cb825e615228daf2d1663e49d70cd5d0e196d126c00302000000000005167b2dd1f0d47f596721c233fd9b2e9919ac91288a000000000c1b5e4800000000000000000000000000000000000000000000000000000000000000000000")))); - - c.bench_function("encode_to_hex_str ('to_hex' from stacks) <360>", |b| b.iter(|| encode_hex_str_stacks())); - c.bench_function("encode_to_hex_str (function from crate 'hex') <360>", |b| b.iter(|| encode_hex_str_crate())); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); diff --git a/components/chainhook-cli/benches/storage/redis.rs b/components/chainhook-cli/benches/storage/redis.rs deleted file mode 100644 index fc6d6c8fa..000000000 --- a/components/chainhook-cli/benches/storage/redis.rs +++ /dev/null @@ -1,17 +0,0 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use chainhook_event_indexer::ingestion::start_ingesting; -use chainhook_sdk::indexer::IndexerConfig; - - -fn criterion_benchmark(c: &mut Criterion) { - let config = IndexerConfig { - stacks_node_rpc_url: "http://0.0.0.0:20443".into(), - bitcoind_rpc_url: "http://0.0.0.0:18443".into(), - bitcoind_rpc_username: "devnet".into(), - bitcoind_rpc_password: "devnet".into(), - }; - c.bench_function("redis", |b| b.iter(|| start_ingesting("/Users/ludovic/Downloads/stacks-blockchain-api.tsv".into(), config.clone()).unwrap())); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); diff --git a/components/chainhook-cli/benches/storage/rocksdb.rs b/components/chainhook-cli/benches/storage/rocksdb.rs deleted file mode 100644 index 4bec91251..000000000 --- a/components/chainhook-cli/benches/storage/rocksdb.rs +++ /dev/null @@ -1,16 +0,0 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; - -fn ingest_tsv(n: u64) -> u64 { - match n { - 0 => 1, - 1 => 1, - n => fibonacci(n-1) + fibonacci(n-2), - } -} - -fn criterion_benchmark(c: &mut Criterion) { - c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20)))); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); diff --git a/components/chainhook-cli/benches/storage/sqlite.rs b/components/chainhook-cli/benches/storage/sqlite.rs deleted file mode 100644 index 4bec91251..000000000 --- a/components/chainhook-cli/benches/storage/sqlite.rs +++ /dev/null @@ -1,16 +0,0 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; - -fn ingest_tsv(n: u64) -> u64 { - match n { - 0 => 1, - 1 => 1, - n => fibonacci(n-1) + fibonacci(n-2), - } -} - -fn criterion_benchmark(c: &mut Criterion) { - c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20)))); -} - -criterion_group!(benches, criterion_benchmark); -criterion_main!(benches); diff --git a/components/chainhook-cli/src/archive/mod.rs b/components/chainhook-cli/src/archive/mod.rs index 1b87002eb..759e97071 100644 --- a/components/chainhook-cli/src/archive/mod.rs +++ b/components/chainhook-cli/src/archive/mod.rs @@ -167,3 +167,6 @@ pub async fn download_stacks_dataset_if_required(config: &mut Config, ctx: &Cont false } } + +#[cfg(test)] +pub mod tests; diff --git a/components/chainhook-cli/src/archive/tests/fixtures/stacks_blocks.tsv.gz b/components/chainhook-cli/src/archive/tests/fixtures/stacks_blocks.tsv.gz new file mode 100644 index 0000000000000000000000000000000000000000..91813fb7cdb804d83cb72aade5e89909f7855d88 GIT binary patch literal 1306 zcmV+#1?Bo5iwFodB^+e{19Nm?V{3C?Vr*|?YjZAib9Mmjnq8BdDj0yT)1TpWW{QGe z`738S4g#KaPBb}+yXj=|--~9OXcE)iMrIAXy;+5V!UMdL2Y2BvzL(-HN!J_p-(v4{ zf0GxH|NA1HmAm|%K zw*#Fk*3nJ9>WiFJo33_k6(_a$zY!%9&I+CTYkC^JhmVbc>ui}9qL#GSb}uI@TGo`w zd{frW>Yu$McR5$@)=N)vp0rPryCa&eoT@=Ks)SQFjETBd`4xRjDp5CUd2CyV@O!G< z4O{CXf{^eSM^Wf<>ZhFJh!O7lK}=%I8BSe7DI)?=_oC79t*(f0sEP!F&>)L>6h;AI z*d?5YVVd$N^+M{UZiIXh2ZH%D@KG#6L9z&A#seCrJoQN6vDnXoIEZKzgftCOB%%z_ zfW(mq5aKB#0n0?3MTCWMh+?iv#sLmhi@ejzkcX(Ej;h!R)^wfEHnr-{vRSW}4%?K9 z3zG>=^JCg!IY!JK5Oaap?1^~;Vjd8iJuy5WhJn~zi2YFi_f^HcKZP{5DT-W5p|Uf& zuEl$?UYwIZx1!~#Fn8rMQ8~-OZPFESR(ppQo2I>T+O@Y5EZ^o`j?-UpJ{*e| zxq8lf(PKN>)Gkh6rFL<9kXmN)>IKd@*LAn4*L9Cpa4stk&}>V)5sP!ogV5 zai8=PEanpg;t$~;O#SD_?Dl>iE2w(W(-XGUxxb7@Ka*LzKd1cRqeO1DIa8M%CFjuo zT3S%qRBCst8mqdX5^uEP?T@EF4&S_mch8i2Q=4*6lPUMcOu47UlzX~Nc~8OXI#6Jq zDes?K7#Ra#%FT8{V9Jdl2B!Skh=D1eDKRkR)@%?S-|vAbHxDY9a?^-{DYuU~m~xBZ zgDJNNHkfi-NP{T{Q$Dx#e2Q2MrW{N;m~t@X#+h=w!1qi!p4yaSO{N@=nR2Yflw)0{ zyrdv@Atrzn+Fw4xoJef zl-tJ~Ou5DI!IWDB8%((^q`{PfDWBVVK1D1BQx2vaOgWfx<4ieOkb9<_Ol``ECR0wv zOgYhF%84#h-c#_p4iuPY%KPUQM#cb`apRV9LRigDD47 QZk#Fq1*!<{bkdsu07-O-5C8xG literal 0 HcmV?d00001 diff --git a/components/chainhook-cli/src/archive/tests/mod.rs b/components/chainhook-cli/src/archive/tests/mod.rs new file mode 100644 index 000000000..eb97bfff9 --- /dev/null +++ b/components/chainhook-cli/src/archive/tests/mod.rs @@ -0,0 +1,84 @@ +use std::{ + fs::{self, File}, + io::Read, + net::{IpAddr, Ipv4Addr}, + thread::sleep, + time::Duration, +}; + +use chainhook_sdk::utils::Context; + +use crate::{ + archive::{ + default_tsv_file_path, default_tsv_sha_file_path, download_stacks_dataset_if_required, + }, + config::{Config, EventSourceConfig, UrlConfig}, + service::tests::helpers::get_free_port, +}; +use rocket::Config as RocketConfig; + +const GZ_DIR: &str = "src/archive/tests/fixtures/stacks_blocks.tsv.gz"; +const TMP_DIR: &str = "src/archive/tests/fixtures/tmp"; +const SHA256_HASH: &str = "49ca5f80b2a1303e7f7e98a4f9d39efeb35fd9f3696c4cd9615e0b5cd1f3dcfb"; + +#[get("/stacks_blocks.tsv.sha256")] +fn get_sha256() -> String { + format!("{SHA256_HASH}") +} + +#[get("/stacks_blocks.tsv.gz")] +fn get_gz() -> Vec { + let dir = format!("{}/{GZ_DIR}", env!("CARGO_MANIFEST_DIR")); + let mut f = File::open(dir).unwrap(); + let mut buffer: Vec = Vec::new(); + f.read_to_end(&mut buffer).unwrap(); + buffer +} + +async fn start_service(port: u16) { + let config = RocketConfig::figment() + .merge(("port", port)) + .merge(("address", IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))) + .merge(("log_level", "off")); + let _rocket = rocket::build() + .configure(config) + .mount("/", routes![get_sha256, get_gz]) + .launch() + .await + .unwrap(); +} + +#[tokio::test] +async fn it_downloads_stacks_dataset_if_required() { + let port = get_free_port().unwrap(); + let mut config = Config::default(false, true, false, &None).unwrap(); + + config.storage.working_dir = format!("{}/{}", env!("CARGO_MANIFEST_DIR"), TMP_DIR); + config.event_sources = vec![EventSourceConfig::StacksTsvUrl(UrlConfig { + file_url: format!("http://0.0.0.0:{port}/stacks_blocks.tsv"), + })]; + let _ = hiro_system_kit::thread_named("Start tsv service") + .spawn(move || { + let future = start_service(port); + let _ = hiro_system_kit::nestable_block_on(future); + }) + .expect("unable to spawn thread"); + + sleep(Duration::new(1, 0)); + let logger = hiro_system_kit::log::setup_logger(); + let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); + let ctx = Context { + logger: Some(logger), + tracer: false, + }; + let mut config_clone = config.clone(); + assert!(download_stacks_dataset_if_required(&mut config, &ctx).await); + assert!(!download_stacks_dataset_if_required(&mut config_clone, &ctx).await); + + let mut tsv_file_path = config.expected_cache_path(); + tsv_file_path.push(default_tsv_file_path(&config.network.stacks_network)); + fs::remove_file(tsv_file_path).unwrap(); + let mut tsv_sha_file_path = config.expected_cache_path(); + tsv_sha_file_path.push(default_tsv_sha_file_path(&config.network.stacks_network)); + fs::remove_file(tsv_sha_file_path).unwrap(); +} diff --git a/components/chainhook-cli/src/config/file.rs b/components/chainhook-cli/src/config/file.rs index b735baadb..ad76a7a91 100644 --- a/components/chainhook-cli/src/config/file.rs +++ b/components/chainhook-cli/src/config/file.rs @@ -1,3 +1,5 @@ +use chainhook_sdk::types::BitcoinNetwork; + #[derive(Deserialize, Debug, Clone)] pub struct ConfigFile { pub storage: StorageConfigFile, @@ -43,7 +45,7 @@ pub struct LimitsConfigFile { #[derive(Deserialize, Debug, Clone)] pub struct NetworkConfigFile { - pub mode: String, + pub mode: NetworkConfigMode, pub bitcoind_rpc_url: String, pub bitcoind_rpc_username: String, pub bitcoind_rpc_password: String, @@ -51,3 +53,28 @@ pub struct NetworkConfigFile { pub stacks_node_rpc_url: Option, pub stacks_events_ingestion_port: Option, } + +#[derive(Deserialize, Debug, Clone)] +#[serde(rename_all = "snake_case")] +pub enum NetworkConfigMode { + Devnet, + Testnet, + Mainnet, +} + +impl NetworkConfigMode { + pub fn from_bitcoin_network(network: &BitcoinNetwork) -> Self { + match network { + BitcoinNetwork::Regtest => NetworkConfigMode::Devnet, + BitcoinNetwork::Testnet => NetworkConfigMode::Testnet, + BitcoinNetwork::Mainnet => NetworkConfigMode::Mainnet, + } + } + pub fn as_str(&self) -> &str { + match self { + NetworkConfigMode::Devnet => "devnet", + NetworkConfigMode::Testnet => "testnet", + NetworkConfigMode::Mainnet => "mainnet", + } + } +} diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 074bc328f..0e6aff195 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -1,6 +1,8 @@ +use super::file::NetworkConfigMode; use chainhook_sdk::types::BitcoinNetwork; pub fn generate_config(network: &BitcoinNetwork) -> String { + let mode = NetworkConfigMode::from_bitcoin_network(network); let network = format!("{:?}", network); let conf = format!( r#"[storage] @@ -15,7 +17,7 @@ working_dir = "cache" # database_uri = "redis://localhost:6379/" [network] -mode = "{network}" +mode = "{mode}" bitcoind_rpc_url = "http://localhost:8332" bitcoind_rpc_username = "devnet" bitcoind_rpc_password = "devnet" @@ -39,6 +41,7 @@ max_caching_memory_size_mb = 32000 [[event_source]] tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" "#, + mode = mode.as_str(), network = network.to_lowercase(), ); return conf; diff --git a/components/chainhook-cli/src/config/mod.rs b/components/chainhook-cli/src/config/mod.rs index 28eecfa3d..b690e623f 100644 --- a/components/chainhook-cli/src/config/mod.rs +++ b/components/chainhook-cli/src/config/mod.rs @@ -24,7 +24,7 @@ pub const BITCOIN_SCAN_THREAD_POOL_SIZE: usize = 10; pub const STACKS_MAX_PREDICATE_REGISTRATION: usize = 50; pub const BITCOIN_MAX_PREDICATE_REGISTRATION: usize = 50; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct Config { pub storage: StorageConfig, pub http_api: PredicatesApi, @@ -33,25 +33,25 @@ pub struct Config { pub network: IndexerConfig, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct StorageConfig { pub working_dir: String, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub enum PredicatesApi { Off, On(PredicatesApiConfig), } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct PredicatesApiConfig { pub http_port: u16, pub database_uri: String, pub display_logs: bool, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub enum EventSourceConfig { StacksTsvPath(PathConfig), StacksTsvUrl(UrlConfig), @@ -59,17 +59,17 @@ pub enum EventSourceConfig { OrdinalsSqliteUrl(UrlConfig), } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct PathConfig { pub file_path: PathBuf, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct UrlConfig { pub file_url: String, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct LimitsConfig { pub max_number_of_bitcoin_predicates: usize, pub max_number_of_concurrent_bitcoin_scans: usize, @@ -232,20 +232,6 @@ impl Config { })); } - pub fn add_ordinals_sqlite_remote_source_url(&mut self, file_url: &str) { - self.event_sources - .push(EventSourceConfig::OrdinalsSqliteUrl(UrlConfig { - file_url: file_url.to_string(), - })); - } - - pub fn add_local_ordinals_sqlite_source(&mut self, file_path: &PathBuf) { - self.event_sources - .push(EventSourceConfig::OrdinalsSqlitePath(PathConfig { - file_path: file_path.clone(), - })); - } - pub fn expected_api_database_uri(&self) -> &str { &self.expected_api_config().database_uri } @@ -272,15 +258,6 @@ impl Config { destination_path } - fn expected_remote_ordinals_sqlite_base_url(&self) -> &String { - for source in self.event_sources.iter() { - if let EventSourceConfig::OrdinalsSqliteUrl(config) = source { - return &config.file_url; - } - } - panic!("expected remote-tsv source") - } - fn expected_remote_stacks_tsv_base_url(&self) -> &String { for source in self.event_sources.iter() { if let EventSourceConfig::StacksTsvUrl(config) = source { @@ -298,14 +275,6 @@ impl Config { format!("{}.gz", self.expected_remote_stacks_tsv_base_url()) } - pub fn expected_remote_ordinals_sqlite_sha256(&self) -> String { - format!("{}.sha256", self.expected_remote_ordinals_sqlite_base_url()) - } - - pub fn expected_remote_ordinals_sqlite_url(&self) -> String { - format!("{}.gz", self.expected_remote_ordinals_sqlite_base_url()) - } - pub fn rely_on_remote_stacks_tsv(&self) -> bool { for source in self.event_sources.iter() { if let EventSourceConfig::StacksTsvUrl(_config) = source { @@ -315,15 +284,6 @@ impl Config { false } - pub fn rely_on_remote_ordinals_sqlite(&self) -> bool { - for source in self.event_sources.iter() { - if let EventSourceConfig::OrdinalsSqliteUrl(_config) = source { - return true; - } - } - false - } - pub fn should_download_remote_stacks_tsv(&self) -> bool { let mut rely_on_remote_tsv = false; let mut remote_tsv_present_locally = false; @@ -338,20 +298,6 @@ impl Config { rely_on_remote_tsv == true && remote_tsv_present_locally == false } - pub fn should_download_remote_ordinals_sqlite(&self) -> bool { - let mut rely_on_remote_tsv = false; - let mut remote_tsv_present_locally = false; - for source in self.event_sources.iter() { - if let EventSourceConfig::OrdinalsSqliteUrl(_config) = source { - rely_on_remote_tsv = true; - } - if let EventSourceConfig::OrdinalsSqlitePath(_config) = source { - remote_tsv_present_locally = true; - } - } - rely_on_remote_tsv == true && remote_tsv_present_locally == false - } - pub fn default( devnet: bool, testnet: bool, @@ -465,3 +411,6 @@ pub fn default_cache_path() -> String { cache_path.push("cache"); format!("{}", cache_path.display()) } + +#[cfg(test)] +pub mod tests; diff --git a/components/chainhook-cli/src/config/tests/fixtures/devnet_chainhook.toml b/components/chainhook-cli/src/config/tests/fixtures/devnet_chainhook.toml new file mode 100644 index 000000000..dbdb4a589 --- /dev/null +++ b/components/chainhook-cli/src/config/tests/fixtures/devnet_chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "devnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_url = "https://archive.hiro.so/regtest/stacks-blockchain-api/regtest-stacks-blockchain-api-latest" diff --git a/components/chainhook-cli/src/config/tests/fixtures/local_tsv_chainhook.toml b/components/chainhook-cli/src/config/tests/fixtures/local_tsv_chainhook.toml new file mode 100644 index 000000000..e70a9ad34 --- /dev/null +++ b/components/chainhook-cli/src/config/tests/fixtures/local_tsv_chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "devnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_path = "./file.tsv" diff --git a/components/chainhook-cli/src/config/tests/fixtures/mainnet_chainhook.toml b/components/chainhook-cli/src/config/tests/fixtures/mainnet_chainhook.toml new file mode 100644 index 000000000..d403113ca --- /dev/null +++ b/components/chainhook-cli/src/config/tests/fixtures/mainnet_chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "mainnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" diff --git a/components/chainhook-cli/src/config/tests/fixtures/testnet_chainhook.toml b/components/chainhook-cli/src/config/tests/fixtures/testnet_chainhook.toml new file mode 100644 index 000000000..dc5c4b0ef --- /dev/null +++ b/components/chainhook-cli/src/config/tests/fixtures/testnet_chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "testnet" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_url = "https://archive.hiro.so/testnet/stacks-blockchain-api/testnet-stacks-blockchain-api-latest" diff --git a/components/chainhook-cli/src/config/tests/fixtures/unsupported_chainhook.toml b/components/chainhook-cli/src/config/tests/fixtures/unsupported_chainhook.toml new file mode 100644 index 000000000..835cac1e4 --- /dev/null +++ b/components/chainhook-cli/src/config/tests/fixtures/unsupported_chainhook.toml @@ -0,0 +1,35 @@ +[storage] +working_dir = "cache" + +# The Http Api allows you to register / deregister +# dynamically predicates. +# Disable by default. +# +# [http_api] +# http_port = 20456 +# database_uri = "redis://localhost:6379/" + +[network] +mode = "unsupported" +bitcoind_rpc_url = "http://localhost:8332" +bitcoind_rpc_username = "devnet" +bitcoind_rpc_password = "devnet" +# Bitcoin block events can be received by Chainhook +# either through a Bitcoin node's ZeroMQ interface, +# or through the Stacks node. The Stacks node is +# used by default: +stacks_node_rpc_url = "http://localhost:20443" +# but zmq can be used instead: +# bitcoind_zmq_url = "tcp://0.0.0.0:18543" + +[limits] +max_number_of_bitcoin_predicates = 100 +max_number_of_concurrent_bitcoin_scans = 100 +max_number_of_stacks_predicates = 10 +max_number_of_concurrent_stacks_scans = 10 +max_number_of_processing_threads = 16 +max_number_of_networking_threads = 16 +max_caching_memory_size_mb = 32000 + +[[event_source]] +tsv_file_url = "https://archive.hiro.so/regtest/stacks-blockchain-api/regtest-stacks-blockchain-api-latest" diff --git a/components/chainhook-cli/src/config/tests/mod.rs b/components/chainhook-cli/src/config/tests/mod.rs new file mode 100644 index 000000000..ec0701e4b --- /dev/null +++ b/components/chainhook-cli/src/config/tests/mod.rs @@ -0,0 +1,140 @@ +use std::path::PathBuf; + +use crate::config::{file::NetworkConfigMode, PredicatesApi, PredicatesApiConfig}; + +use super::{generator::generate_config, Config, ConfigFile, EventSourceConfig, PathConfig}; +use chainhook_sdk::types::{BitcoinNetwork, StacksNetwork}; +use test_case::test_case; + +const LOCAL_DIR: &str = env!("CARGO_MANIFEST_DIR"); +#[test_case(BitcoinNetwork::Regtest)] +#[test_case(BitcoinNetwork::Testnet)] +#[test_case(BitcoinNetwork::Mainnet)] +fn config_from_file_matches_generator_for_all_networks(network: BitcoinNetwork) { + let mode = NetworkConfigMode::from_bitcoin_network(&network); + let path = format!( + "{}/src/config/tests/fixtures/{}_chainhook.toml", + LOCAL_DIR, + mode.as_str() + ); + let from_path_config = Config::from_file_path(&path).unwrap(); + let generated_config_str = generate_config(&network); + let generated_config_file: ConfigFile = toml::from_str(&generated_config_str).unwrap(); + let generated_config = Config::from_config_file(generated_config_file).unwrap(); + assert_eq!(generated_config, from_path_config); +} + +#[test] +fn config_from_file_allows_local_tsv_file() { + let path = format!( + "{}/src/config/tests/fixtures/local_tsv_chainhook.toml", + LOCAL_DIR, + ); + + Config::from_file_path(&path).expect("failed to generate config with local tsv path"); +} + +#[test] +fn parse_config_from_file_rejects_config_with_unsupported_mode() { + let path = format!( + "{}/src/config/tests/fixtures/unsupported_chainhook.toml", + LOCAL_DIR + ); + Config::from_file_path(&path) + .expect_err("Did not reject unsupported network mode as expected."); +} + +#[test] +fn is_http_api_enabled_handles_both_modes() { + let mut config = Config::default(true, false, false, &None).unwrap(); + assert!(!config.is_http_api_enabled()); + config.http_api = PredicatesApi::On(PredicatesApiConfig { + http_port: 0, + database_uri: format!(""), + display_logs: false, + }); + assert!(config.is_http_api_enabled()); +} + +#[test] +fn should_download_remote_stacks_tsv_handles_both_modes() { + let url_src = EventSourceConfig::StacksTsvUrl(super::UrlConfig { + file_url: String::new(), + }); + let path_src = EventSourceConfig::StacksTsvPath(PathConfig { + file_path: PathBuf::new(), + }); + let mut config = Config::default(true, false, false, &None).unwrap(); + + config.event_sources = vec![url_src.clone(), path_src.clone()]; + assert_eq!(config.should_download_remote_stacks_tsv(), false); + + config.event_sources = vec![path_src.clone()]; + assert_eq!(config.should_download_remote_stacks_tsv(), false); + + config.event_sources = vec![]; + assert_eq!(config.should_download_remote_stacks_tsv(), false); + + config.event_sources = vec![url_src.clone()]; + assert_eq!(config.should_download_remote_stacks_tsv(), true); +} + +#[test] +#[should_panic(expected = "expected remote-tsv source")] +fn expected_remote_stacks_tsv_base_url_panics_if_missing() { + let url_src = EventSourceConfig::StacksTsvUrl(super::UrlConfig { + file_url: format!("test"), + }); + let mut config = Config::default(true, false, false, &None).unwrap(); + + config.event_sources = vec![url_src.clone()]; + assert_eq!(config.expected_remote_stacks_tsv_base_url(), "test"); + + config.event_sources = vec![]; + config.expected_remote_stacks_tsv_base_url(); +} + +#[test] +#[should_panic(expected = "expected local-tsv source")] +fn expected_local_stacks_tsv_base_url_panics_if_missing() { + let path = PathBuf::from("test"); + let path_src = EventSourceConfig::StacksTsvPath(PathConfig { + file_path: path.clone(), + }); + let mut config = Config::default(true, false, false, &None).unwrap(); + + config.event_sources = vec![path_src.clone()]; + assert_eq!(config.expected_local_stacks_tsv_file(), &path); + + config.event_sources = vec![]; + config.expected_local_stacks_tsv_file(); +} + +#[test] +fn add_local_stacks_tsv_source_allows_adding_src() { + let mut config = Config::default(true, false, false, &None).unwrap(); + assert_eq!(config.event_sources.len(), 0); + let path = PathBuf::from("test"); + config.add_local_stacks_tsv_source(&path); + assert_eq!(config.event_sources.len(), 1); +} +#[test] +fn it_has_default_config_for_each_network() { + let config = Config::default(true, false, false, &None).unwrap(); + assert_eq!(config.network.bitcoin_network, BitcoinNetwork::Regtest); + assert_eq!(config.network.stacks_network, StacksNetwork::Devnet); + let config = Config::default(false, true, false, &None).unwrap(); + assert_eq!(config.network.bitcoin_network, BitcoinNetwork::Testnet); + assert_eq!(config.network.stacks_network, StacksNetwork::Testnet); + let config = Config::default(false, false, true, &None).unwrap(); + assert_eq!(config.network.bitcoin_network, BitcoinNetwork::Mainnet); + assert_eq!(config.network.stacks_network, StacksNetwork::Mainnet); + let path = format!( + "{}/src/config/tests/fixtures/devnet_chainhook.toml", + LOCAL_DIR + ); + let config = Config::default(false, false, false, &Some(path)).unwrap(); + assert_eq!(config.network.bitcoin_network, BitcoinNetwork::Regtest); + assert_eq!(config.network.stacks_network, StacksNetwork::Devnet); + Config::default(true, true, false, &None).expect_err("expected invalid combination error"); +} diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 6a2fbff29..7bee59e44 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -293,7 +293,7 @@ pub async fn execute_predicates_action<'a>( BitcoinChainhookOccurrence::File(path, bytes) => { file_append(path, bytes, &ctx)? } - BitcoinChainhookOccurrence::Data(_payload) => unreachable!(), + BitcoinChainhookOccurrence::Data(_payload) => {} }; } } diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index fe487f123..351da3aca 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -941,9 +941,13 @@ pub fn set_confirmed_expiration_status( let expired_data = match current_status { Some(status) => match status { PredicateStatus::UnconfirmedExpiration(expired_data) => expired_data, + PredicateStatus::ConfirmedExpiration(_) => { + warn!(ctx.expect_logger(), "Attempting to set ConfirmedExpiration status when ConfirmedExpiration status has already been set for predicate {}", predicate_key); + return; + } _ => unreachable!("unreachable predicate status: {:?}", status), }, - None => unreachable!(), + None => unreachable!("found no status for predicate: {}", predicate_key), }; update_predicate_status( predicate_key, diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs b/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs index 7760e6390..75675070a 100644 --- a/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs +++ b/components/chainhook-cli/src/service/tests/helpers/mock_bitcoin_rpc.rs @@ -1,4 +1,10 @@ -use chainhook_sdk::bitcoincore_rpc_json::bitcoin::TxMerkleNode; +use chainhook_sdk::bitcoincore_rpc_json::GetRawTransactionResultVoutScriptPubKey; +use chainhook_sdk::indexer::bitcoin::BitcoinBlockFullBreakdown; +use chainhook_sdk::indexer::bitcoin::BitcoinTransactionFullBreakdown; +use chainhook_sdk::indexer::bitcoin::BitcoinTransactionInputFullBreakdown; +use chainhook_sdk::indexer::bitcoin::BitcoinTransactionInputPrevoutFullBreakdown; +use chainhook_sdk::indexer::bitcoin::BitcoinTransactionOutputFullBreakdown; +use chainhook_sdk::indexer::bitcoin::GetRawTransactionResultVinScriptSig; use rocket::serde::json::Value; use std::cmp::max; use std::collections::HashMap; @@ -11,14 +17,13 @@ use std::sync::RwLock; use chainhook_sdk::bitcoincore_rpc_json::bitcoin::hashes::sha256d::Hash; use chainhook_sdk::bitcoincore_rpc_json::bitcoin::Amount; use chainhook_sdk::bitcoincore_rpc_json::bitcoin::BlockHash; -use chainhook_sdk::bitcoincore_rpc_json::GetBlockResult; use chainhook_sdk::bitcoincore_rpc_json::GetBlockchainInfoResult; use chainhook_sdk::bitcoincore_rpc_json::GetNetworkInfoResult; use rocket::serde::json::Json; use rocket::Config; use rocket::State; -use super::height_to_hash_str; +use super::branch_and_height_to_hash_str; #[derive(Clone, Serialize, Deserialize, Debug)] #[serde(crate = "rocket::serde")] @@ -29,71 +34,148 @@ struct Rpc { params: Vec, } -fn height_to_hash(height: u64) -> BlockHash { - let hash = Hash::from_str(&height_to_hash_str(height)).unwrap(); +fn branch_and_height_to_hash(branch: Option, height: u64) -> BlockHash { + let hash = Hash::from_str(&branch_and_height_to_hash_str(branch, height)).unwrap(); BlockHash::from_hash(hash) } -fn height_to_merkle_node(height: u64) -> TxMerkleNode { - let hash = Hash::from_str(&height_to_hash_str(height)).unwrap(); - TxMerkleNode::from_hash(hash) +#[derive(Clone, Serialize, Deserialize, Debug)] +#[serde(crate = "rocket::serde")] +pub struct TipData { + pub branch: BranchKey, + pub parent_branch_key: Option, + pub parent_height_at_fork: Option, } -#[post("/increment-chain-tip")] -fn handle_increment_chain_tip(chain_tip: &State>>) -> Value { - let mut chain_tip = chain_tip.inner().write().unwrap(); +#[post( + "/increment-chain-tip", + format = "application/json", + data = "" +)] +fn handle_increment_chain_tip( + tip_data: Json, + fork_tracker_rw_lock: &State>>>, +) -> Value { + let tip_data = tip_data.into_inner(); + let branch = tip_data.branch; + let mut fork_tracker = fork_tracker_rw_lock.inner().write().unwrap(); + let (chain_tip, _parent_info) = match fork_tracker.get_mut(&branch) { + None => { + let parent_branch = tip_data.parent_branch_key.unwrap(); + let parent_height_at_fork = tip_data.parent_height_at_fork.unwrap(); + let branch_chain_tip = parent_height_at_fork + 1; + fork_tracker.insert( + branch, + ( + branch_chain_tip, + Some((parent_branch, parent_height_at_fork)), + ), + ); + return json!(branch_chain_tip); + } + Some(tip) => tip, + }; *chain_tip += 1; json!(chain_tip.to_owned()) } #[post("/", format = "application/json", data = "")] -fn handle_rpc(rpc: Json, chain_tip: &State>>) -> Value { +fn handle_rpc( + rpc: Json, + fork_tracker_rw_lock: &State>>>, +) -> Value { let rpc = rpc.into_inner(); - let chain_tip = *chain_tip.inner().read().unwrap(); + let fork_tracker = fork_tracker_rw_lock.inner().read().unwrap(); match rpc.method.as_str() { "getblock" => { let hash = rpc.params[0].as_str().unwrap(); - let prefix = hash.chars().take_while(|&ch| ch == '0').collect::(); + let mut chars = hash.chars(); + let branch = chars.next().unwrap(); + let prefix = chars.take_while(|&ch| ch == '0').collect::(); let height = hash.split(&prefix).collect::>()[1]; let height = height.parse::().unwrap_or(0); - if height > chain_tip { + let (chain_tip, parent_data) = fork_tracker.get(&branch).unwrap_or(&(0, None)); + if &height > chain_tip { return json!({ "id": rpc.id, "jsonrpc": rpc.jsonrpc, "error": format!("invalid request: requested block is above chain tip: height {}, chain tip: {}", height, chain_tip) }); } - let next_block_hash = if height == chain_tip { - None - } else { - Some(height_to_hash(height + 1)) - }; + let confirmations = max(0, chain_tip - height) as i32; + let previousblockhash = if height == 0 { None } else { - Some(height_to_hash(height - 1)) + let parent_height = height - 1; + let mut parent_branch = branch; + if let Some((parent_branch_key, parent_height_at_fork)) = parent_data { + if &parent_height == parent_height_at_fork { + parent_branch = *parent_branch_key; + } + } + Some(branch_and_height_to_hash_str( + Some(parent_branch), + parent_height, + )) }; - let block = GetBlockResult { - hash: BlockHash::from_hash(Hash::from_str(hash).unwrap()), + + let coinbase = BitcoinTransactionFullBreakdown { + txid: branch_and_height_to_hash_str(Some(branch), height), + vin: vec![BitcoinTransactionInputFullBreakdown { + sequence: 0, + txid: None, + vout: None, + script_sig: None, + txinwitness: None, + prevout: None, + }], + vout: vec![BitcoinTransactionOutputFullBreakdown { + value: Amount::ZERO, + n: 0, + script_pub_key: GetRawTransactionResultVoutScriptPubKey { + asm: format!(""), + hex: vec![], + req_sigs: None, + type_: None, + addresses: None, + }, + }], + }; + let tx = BitcoinTransactionFullBreakdown { + txid: branch_and_height_to_hash_str(Some(branch), height + 1), + vin: vec![BitcoinTransactionInputFullBreakdown { + sequence: 0, + txid: Some(branch_and_height_to_hash_str(Some(branch), height + 1)), + vout: Some(1), + script_sig: Some(GetRawTransactionResultVinScriptSig { hex: format!("") }), + txinwitness: Some(vec![format!("")]), + prevout: Some(BitcoinTransactionInputPrevoutFullBreakdown { + height: height, + value: Amount::ZERO, + }), + }], + vout: vec![BitcoinTransactionOutputFullBreakdown { + value: Amount::ZERO, + n: 0, + script_pub_key: GetRawTransactionResultVoutScriptPubKey { + asm: format!(""), + hex: vec![], + req_sigs: None, + type_: None, + addresses: None, + }, + }], + }; + let block = BitcoinBlockFullBreakdown { + hash: hash.into(), confirmations, - size: 0, - strippedsize: None, - weight: 0, height: height as usize, - version: 19000, - version_hex: None, - merkleroot: height_to_merkle_node(height), - tx: vec![], + tx: vec![coinbase, tx], time: 0, - mediantime: None, nonce: 0, - bits: "".to_string(), - difficulty: 0.0, - chainwork: vec![], - n_tx: 0, previousblockhash, - nextblockhash: next_block_hash, }; json!({ "id": rpc.id, @@ -102,13 +184,18 @@ fn handle_rpc(rpc: Json, chain_tip: &State>>) -> Value { }) } "getblockchaininfo" => { - let hash = format!("{:0>64}", chain_tip.to_string()); - let hash = Hash::from_str(&hash).unwrap(); + let (branch, (chain_tip, _)) = fork_tracker + .iter() + .max_by(|a, b| a.1.cmp(&b.1)) + .map(|kv| kv) + .unwrap(); + + let hash = branch_and_height_to_hash(Some(*branch), *chain_tip); let blockchain_info = GetBlockchainInfoResult { chain: "regtest".into(), blocks: chain_tip.to_owned(), headers: 0, - best_block_hash: BlockHash::from_hash(hash), + best_block_hash: hash, difficulty: 0.0, median_time: 0, verification_progress: 0.0, @@ -154,29 +241,62 @@ fn handle_rpc(rpc: Json, chain_tip: &State>>) -> Value { }) } "getblockhash" => { + let (branch, _) = fork_tracker + .iter() + .max_by(|a, b| a.1.cmp(&b.1)) + .map(|kv| kv) + .unwrap(); + let height = rpc.params[0].as_u64().unwrap(); - let hash = format!("{:0>64}", height.to_string()); - let hash = Hash::from_str(&hash).unwrap(); - let hash = BlockHash::from_hash(hash); + let hash = branch_and_height_to_hash(Some(*branch), height); json!({ "id": serde_json::to_value(rpc.id).unwrap(), "jsonrpc": rpc.jsonrpc, "result": serde_json::to_value(hash).unwrap(), }) } - _ => unimplemented!("unsupported rpc endpoint"), + "gettxoutproof" => { + json!({ + "id": serde_json::to_value(rpc.id).unwrap(), + "jsonrpc": rpc.jsonrpc, + "result": "00", + }) + } + "getaddressinfo" => { + json!({ + "id": serde_json::to_value(rpc.id).unwrap(), + "jsonrpc": rpc.jsonrpc, + "result": { + "address": rpc.params[0] + }, + }) + } + "sendrawtransaction" => { + json!({ + "id": serde_json::to_value(rpc.id).unwrap(), + "jsonrpc": rpc.jsonrpc, + "result": "success", + }) + } + _ => unimplemented!("unsupported rpc endpoint: {}", rpc.method.as_str()), } } +type BranchKey = char; +type Height = u64; +type ForkPoint = (BranchKey, Height); +type ForkData = (Height, Option); pub async fn mock_bitcoin_rpc(port: u16, starting_chain_tip: u64) { let config = Config::figment() .merge(("port", port)) .merge(("address", IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))) .merge(("log_level", "off")); - let chain_tip_rw_lock = Arc::new(RwLock::new(starting_chain_tip)); + let fork_tracker: HashMap = + HashMap::from([('0', (starting_chain_tip, None))]); + let fork_tracker_rw_lock = Arc::new(RwLock::new(fork_tracker)); let _rocket = rocket::build() .configure(config) - .manage(chain_tip_rw_lock) + .manage(fork_tracker_rw_lock) .mount("/", routes![handle_rpc, handle_increment_chain_tip]) .launch() .await diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_service.rs b/components/chainhook-cli/src/service/tests/helpers/mock_service.rs index 608df7a90..20518105a 100644 --- a/components/chainhook-cli/src/service/tests/helpers/mock_service.rs +++ b/components/chainhook-cli/src/service/tests/helpers/mock_service.rs @@ -9,8 +9,10 @@ use crate::config::DEFAULT_REDIS_URI; use crate::service::http_api::start_predicate_api_server; use crate::service::PredicateStatus; use crate::service::Service; +use chainhook_sdk::chainhooks::types::ChainhookFullSpecification; use chainhook_sdk::indexer::IndexerConfig; use chainhook_sdk::observer::ObserverCommand; +use chainhook_sdk::observer::ObserverMetrics; use chainhook_sdk::types::BitcoinBlockSignaling; use chainhook_sdk::types::BitcoinNetwork; use chainhook_sdk::types::Chain; @@ -18,6 +20,7 @@ use chainhook_sdk::types::StacksNetwork; use chainhook_sdk::types::StacksNodeConfig; use chainhook_sdk::utils::Context; use redis::Commands; +use reqwest::Method; use rocket::serde::json::Value as JsonValue; use rocket::Shutdown; use std::path::PathBuf; @@ -41,7 +44,6 @@ pub async fn get_predicate_status(uuid: &str, port: u16) -> Result { attempts += 1; - println!("reattempting get predicate status"); if attempts == 10 { return Err(format!("no result field on get predicate response")); } else { @@ -101,7 +103,6 @@ pub async fn filter_predicate_status_from_all_predicates( }, None => { attempts += 1; - println!("reattempting get predicates"); if attempts == 10 { return Err(format!("no result field on get predicates response")); } else { @@ -118,28 +119,8 @@ pub async fn call_register_predicate( predicate: &JsonValue, port: u16, ) -> Result { - let client = reqwest::Client::new(); - let res =client - .post(format!("http://localhost:{port}/v1/chainhooks")) - .header("Content-Type", "application/json") - .json(predicate) - .send() - .await - .map_err(|e| { - format!( - "Failed to make POST request to localhost:{port}/v1/chainhooks: {}", - e - ) - })? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of POST request to localhost:{port}/v1/chainhooks: {}", - e - ) - })?; - Ok(res) + let url = format!("http://localhost:{port}/v1/chainhooks"); + call_observer_svc(&url, Method::POST, Some(predicate)).await } pub async fn call_deregister_predicate( @@ -147,73 +128,58 @@ pub async fn call_deregister_predicate( predicate_uuid: &str, port: u16, ) -> Result { - let client = reqwest::Client::new(); let chain = match chain { Chain::Bitcoin => "bitcoin", Chain::Stacks => "stacks", }; let url = format!("http://localhost:{port}/v1/chainhooks/{chain}/{predicate_uuid}"); - let res = client - .delete(&url) - .header("Content-Type", "application/json") - .send() - .await - .map_err(|e| format!("Failed to make DELETE request to {url}: {}", e))? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of DELETE request to {url}: {}", - e - ) - })?; - Ok(res) + call_observer_svc(&url, Method::DELETE, None).await } pub async fn call_get_predicate(predicate_uuid: &str, port: u16) -> Result { - let client = reqwest::Client::new(); - let res =client - .get(format!("http://localhost:{port}/v1/chainhooks/{predicate_uuid}")) - .send() - .await - .map_err(|e| { - format!( - "Failed to make GET request to localhost:8765/v1/chainhooks/<{predicate_uuid}>: {}", - e - ) - })? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks/{predicate_uuid}: {}", - e - ) - })?; - Ok(res) + let url = format!("http://localhost:{port}/v1/chainhooks/{predicate_uuid}"); + call_observer_svc(&url, Method::GET, None).await } pub async fn call_get_predicates(port: u16) -> Result { + let url = format!("http://localhost:{port}/v1/chainhooks"); + call_observer_svc(&url, Method::GET, None).await +} + +pub async fn call_observer_svc( + url: &str, + method: Method, + json: Option<&JsonValue>, +) -> Result { let client = reqwest::Client::new(); - let res =client - .get(format!("http://localhost:{port}/v1/chainhooks")) - .send() - .await - .map_err(|e| { - format!( - "Failed to make GET request to localhost:8765/v1/chainhooks: {}", - e - ) - })? - .json::() - .await - .map_err(|e| { - format!( - "Failed to deserialize response of GET request to localhost:{port}/v1/chainhooks: {}", - e - ) - })?; - Ok(res) + let req = match (&method, json) { + (&Method::GET, None) => client.get(url), + (&Method::POST, None) => client.post(url).header("Content-Type", "application/json"), + (&Method::POST, Some(json)) => client + .post(url) + .header("Content-Type", "application/json") + .json(json), + (&Method::DELETE, None) => client + .delete(url) + .header("Content-Type", "application/json"), + _ => unimplemented!(), + }; + req.send() + .await + .map_err(|e| format!("Failed to make {method} request to {url}: {e}",))? + .json::() + .await + .map_err(|e| format!("Failed to deserialize response of {method} request to {url}: {e}",)) +} + +pub async fn call_ping(port: u16) -> Result { + let url = format!("http://localhost:{port}/ping"); + let res = call_observer_svc(&url, Method::GET, None).await?; + match res.get("result") { + Some(result) => serde_json::from_value(result.clone()) + .map_err(|e| format!("failed to parse observer metrics {}", e.to_string())), + None => Err(format!("Failed parse result of observer ping")), + } } pub async fn build_predicate_api_server(port: u16) -> (Receiver, Shutdown) { @@ -288,19 +254,13 @@ pub fn flush_redis(port: u16) { let client = redis::Client::open(format!("redis://localhost:{port}/")) .expect("unable to connect to redis"); let mut predicate_db_conn = client.get_connection().expect("unable to connect to redis"); - let predicate_keys: Vec = predicate_db_conn - .scan_match("predicate:*") + let db_keys: Vec = predicate_db_conn + .scan_match("*") .unwrap() .into_iter() .collect(); - for k in predicate_keys { - predicate_db_conn - .hdel::<_, _, ()>(&k, "predicates") - .unwrap(); - predicate_db_conn.hdel::<_, _, ()>(&k, "status").unwrap(); - predicate_db_conn - .hdel::<_, _, ()>(&k, "specification") - .unwrap(); + for k in db_keys { + predicate_db_conn.del::<_, ()>(&k).unwrap(); } } @@ -348,16 +308,17 @@ pub fn get_chainhook_config( }, } } + pub async fn start_chainhook_service( config: Config, chainhook_port: u16, + startup_predicates: Option>, ctx: &Context, ) -> Result<(), String> { let mut service = Service::new(config, ctx.clone()); - let startup_predicates = vec![]; - let _ = hiro_system_kit::thread_named("Stacks service") + let _ = hiro_system_kit::thread_named("Chainhook service") .spawn(move || { - let future = service.run(startup_predicates); + let future = service.run(startup_predicates.unwrap_or(vec![])); let _ = hiro_system_kit::nestable_block_on(future); }) .map_err(|e| { diff --git a/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs index d2465e358..e3f46b3d7 100644 --- a/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs +++ b/components/chainhook-cli/src/service/tests/helpers/mock_stacks_node.rs @@ -1,8 +1,14 @@ use crate::scan::stacks::{Record, RecordKind}; +use crate::service::tests::helpers::mock_bitcoin_rpc::TipData; use chainhook_sdk::indexer::bitcoin::NewBitcoinBlock; -use chainhook_sdk::indexer::stacks::{NewBlock, NewTransaction}; +use chainhook_sdk::indexer::stacks::{NewBlock, NewEvent, NewTransaction}; +use chainhook_sdk::types::{ + FTBurnEventData, FTMintEventData, FTTransferEventData, NFTBurnEventData, NFTMintEventData, + NFTTransferEventData, STXBurnEventData, STXLockEventData, STXMintEventData, + STXTransferEventData, SmartContractEventData, StacksTransactionEvent, +}; -use super::height_to_prefixed_hash; +use super::{branch_and_height_to_prefixed_hash, height_to_prefixed_hash}; pub const TEST_WORKING_DIR: &str = "src/service/tests/fixtures/tmp"; @@ -15,6 +21,96 @@ pub fn create_tmp_working_dir() -> Result<(String, String), String> { .map_err(|e| format!("failed to create temp working dir: {}", e.to_string()))?; Ok((working_dir, tsv_dir)) } +fn create_stacks_new_event(tx_index: u64, index: u32, event: StacksTransactionEvent) -> NewEvent { + let mut event_type = String::new(); + let stx_transfer_event = if let StacksTransactionEvent::STXTransferEvent(data) = &event { + event_type = format!("stx_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_mint_event = if let StacksTransactionEvent::STXMintEvent(data) = &event { + event_type = format!("stx_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_burn_event = if let StacksTransactionEvent::STXBurnEvent(data) = &event { + event_type = format!("stx_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_lock_event = if let StacksTransactionEvent::STXLockEvent(data) = &event { + event_type = format!("stx_lock"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_transfer_event = if let StacksTransactionEvent::NFTTransferEvent(data) = &event { + event_type = format!("nft_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_mint_event = if let StacksTransactionEvent::NFTMintEvent(data) = &event { + event_type = format!("nft_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_burn_event = if let StacksTransactionEvent::NFTBurnEvent(data) = &event { + event_type = format!("nft_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_transfer_event = if let StacksTransactionEvent::FTTransferEvent(data) = &event { + event_type = format!("ft_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_mint_event = if let StacksTransactionEvent::FTMintEvent(data) = &event { + event_type = format!("ft_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_burn_event = if let StacksTransactionEvent::FTBurnEvent(data) = &event { + event_type = format!("ft_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let contract_event = if let StacksTransactionEvent::SmartContractEvent(data) = &event { + event_type = format!("smart_contract_print_event"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + NewEvent { + txid: format!("transaction_id_{tx_index}"), + committed: false, + event_index: index, + event_type, + stx_transfer_event, + stx_mint_event, + stx_burn_event, + stx_lock_event, + nft_transfer_event, + nft_mint_event, + nft_burn_event, + ft_transfer_event, + ft_mint_event, + ft_burn_event, + data_var_set_event: None, + data_map_insert_event: None, + data_map_update_event: None, + data_map_delete_event: None, + contract_event, + } +} fn create_stacks_new_transaction(index: u64) -> NewTransaction { NewTransaction { @@ -36,6 +132,106 @@ pub fn create_stacks_new_block(height: u64, burn_block_height: u64) -> NewBlock burn_block_height - 1 }; + let mut events = vec![]; + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::STXTransferEvent(STXTransferEventData { + sender: format!(""), + recipient: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::STXMintEvent(STXMintEventData { + recipient: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::STXBurnEvent(STXBurnEventData { + sender: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::STXLockEvent(STXLockEventData { + locked_amount: format!("1"), + unlock_height: format!(""), + locked_address: format!(""), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::NFTTransferEvent(NFTTransferEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + sender: format!(""), + recipient: format!(""), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::NFTMintEvent(NFTMintEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + recipient: format!(""), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::NFTBurnEvent(NFTBurnEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + sender: format!(""), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::FTTransferEvent(FTTransferEventData { + asset_class_identifier: format!(""), + sender: format!(""), + recipient: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::FTMintEvent(FTMintEventData { + asset_class_identifier: format!(""), + recipient: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::FTBurnEvent(FTBurnEventData { + asset_class_identifier: format!(""), + sender: format!(""), + amount: format!("1"), + }), + )); + events.push(create_stacks_new_event( + 0, + events.len() as u32, + StacksTransactionEvent::SmartContractEvent(SmartContractEventData { + contract_identifier: format!(""), + topic: format!("print"), + hex_value: format!(""), + }), + )); NewBlock { block_height: height, block_hash: height_to_prefixed_hash(height), @@ -51,7 +247,7 @@ pub fn create_stacks_new_block(height: u64, burn_block_height: u64) -> NewBlock parent_burn_block_height: burn_block_height, parent_burn_block_timestamp: 0, transactions: (0..4).map(|i| create_stacks_new_transaction(i)).collect(), - events: vec![], + events, matured_miner_rewards: vec![], } } @@ -113,9 +309,9 @@ pub async fn mine_stacks_block( Ok(()) } -fn create_new_burn_block(burn_block_height: u64) -> NewBitcoinBlock { +fn create_new_burn_block(branch: Option, burn_block_height: u64) -> NewBitcoinBlock { NewBitcoinBlock { - burn_block_hash: height_to_prefixed_hash(burn_block_height), + burn_block_hash: branch_and_height_to_prefixed_hash(branch, burn_block_height), burn_block_height, reward_recipients: vec![], reward_slot_holders: vec![], @@ -123,19 +319,25 @@ fn create_new_burn_block(burn_block_height: u64) -> NewBitcoinBlock { } } -pub async fn mine_burn_block( - stacks_ingestion_port: u16, +async fn call_increment_chain_tip( bitcoin_rpc_port: u16, + branch: Option, burn_block_height: u64, + parent_branch_key: Option, + parent_height_at_fork: Option, ) -> Result<(), String> { - let block = create_new_burn_block(burn_block_height); - let serialized_block = serde_json::to_string(&block) - .map_err(|e| format!("failed to serialize burn block: {}", e.to_string()))?; let client = reqwest::Client::new(); + let tip_data = TipData { + branch: branch.unwrap_or('0'), + parent_branch_key, + parent_height_at_fork, + }; let res = client .post(format!( "http://localhost:{bitcoin_rpc_port}/increment-chain-tip" )) + .header("Content-Type", "application/json") + .json(&serde_json::to_value(tip_data).unwrap()) .send() .await .map_err(|e| { @@ -153,6 +355,18 @@ pub async fn mine_burn_block( ) })?; assert_eq!(burn_block_height.to_string(), res); + Ok(()) +} + +async fn call_new_burn_block( + stacks_ingestion_port: u16, + branch: Option, + burn_block_height: u64, +) -> Result<(), String> { + let block = create_new_burn_block(branch, burn_block_height); + let serialized_block = serde_json::to_string(&block) + .map_err(|e| format!("failed to serialize burn block: {}", e.to_string()))?; + let client = reqwest::Client::new(); let _res = client .post(format!( "http://localhost:{stacks_ingestion_port}/new_burn_block" @@ -172,3 +386,36 @@ pub async fn mine_burn_block( })?; Ok(()) } + +pub async fn mine_burn_block( + stacks_ingestion_port: u16, + bitcoin_rpc_port: u16, + branch: Option, + burn_block_height: u64, +) -> Result<(), String> { + call_increment_chain_tip(bitcoin_rpc_port, branch, burn_block_height, None, None).await?; + + call_new_burn_block(stacks_ingestion_port, branch, burn_block_height).await?; + Ok(()) +} + +pub async fn create_burn_fork_at( + stacks_ingestion_port: u16, + bitcoin_rpc_port: u16, + branch: Option, + burn_block_height: u64, + fork_branch: char, + fork_at_height: u64, +) -> Result<(), String> { + call_increment_chain_tip( + bitcoin_rpc_port, + branch, + burn_block_height, + Some(fork_branch), + Some(fork_at_height), + ) + .await?; + + call_new_burn_block(stacks_ingestion_port, branch, burn_block_height).await?; + Ok(()) +} diff --git a/components/chainhook-cli/src/service/tests/helpers/mod.rs b/components/chainhook-cli/src/service/tests/helpers/mod.rs index 8f78b5084..76e186edc 100644 --- a/components/chainhook-cli/src/service/tests/helpers/mod.rs +++ b/components/chainhook-cli/src/service/tests/helpers/mod.rs @@ -12,6 +12,14 @@ fn height_to_hash_str(height: u64) -> String { format!("{:0>64}", height.to_string()) } +pub fn branch_and_height_to_prefixed_hash(branch: Option, height: u64) -> String { + format!("0x{}", branch_and_height_to_hash_str(branch, height)) +} +fn branch_and_height_to_hash_str(branch: Option, height: u64) -> String { + let branch = branch.unwrap_or('0'); + format!("{branch}{:0>63}", height.to_string()) +} + pub fn get_free_port() -> Result { let listener = TcpListener::bind("127.0.0.1:0") .map_err(|e| format!("Failed to bind to port 0: {}", e.to_string()))?; diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index 747c99210..44bad7e1d 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -1,8 +1,13 @@ -use chainhook_sdk::types::Chain; +use chainhook_sdk::chainhooks::types::{ + ChainhookFullSpecification, ChainhookSpecification, StacksChainhookFullSpecification, +}; +use chainhook_sdk::types::{Chain, StacksNetwork}; use chainhook_sdk::utils::Context; use rocket::serde::json::Value as JsonValue; use rocket::Shutdown; +use std::fs::{self}; use std::net::TcpListener; +use std::path::PathBuf; use std::process::Child; use std::thread::sleep; use std::time::Duration; @@ -26,9 +31,14 @@ use crate::service::tests::helpers::mock_service::{ build_predicate_api_server, call_get_predicate, call_register_predicate, get_chainhook_config, get_predicate_status, }; -use crate::service::PredicateStatus; +use crate::service::tests::helpers::mock_stacks_node::create_burn_fork_at; +use crate::service::{PredicateStatus, PredicateStatus::*, ScanningData, StreamingData}; + +use super::http_api::document_predicate_api_server; +use super::{update_predicate_spec, update_predicate_status}; -mod helpers; +pub mod helpers; +mod observer_tests; async fn test_register_predicate(predicate: JsonValue) -> Result<(), (String, Shutdown)> { // perhaps a little janky, we bind to the port 0 to find an open one, then @@ -314,6 +324,8 @@ async fn await_new_scanning_status_complete( async fn setup_stacks_chainhook_test( starting_chain_tip: u64, + redis_seed: Option<(StacksChainhookFullSpecification, PredicateStatus)>, + startup_predicates: Option>, ) -> (Child, String, u16, u16, u16, u16) { let ( redis_port, @@ -326,12 +338,7 @@ async fn setup_stacks_chainhook_test( let mut redis_process = start_redis(redis_port) .await .unwrap_or_else(|e| panic!("test failed with error: {e}")); - - let (working_dir, tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { - flush_redis(redis_port); - redis_process.kill().unwrap(); - panic!("test failed with error: {e}"); - }); + flush_redis(redis_port); let logger = hiro_system_kit::log::setup_logger(); let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); @@ -340,6 +347,37 @@ async fn setup_stacks_chainhook_test( tracer: false, }; + if let Some((predicate, status)) = redis_seed { + let client = redis::Client::open(format!("redis://localhost:{redis_port}/")) + .unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + let mut connection = client.get_connection().unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + let stacks_spec = predicate + .into_selected_network_specification(&StacksNetwork::Devnet) + .unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let spec = ChainhookSpecification::Stacks(stacks_spec); + update_predicate_spec(&spec.key(), &spec, &mut connection, &ctx); + update_predicate_status(&spec.key(), status, &mut connection, &ctx); + } + + let (working_dir, tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + write_stacks_blocks_to_tsv(starting_chain_tip, &tsv_dir).unwrap_or_else(|e| { std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); @@ -366,7 +404,7 @@ async fn setup_stacks_chainhook_test( panic!("test failed with error: {e}"); }); - start_chainhook_service(config, chainhook_service_port, &ctx) + start_chainhook_service(config, chainhook_service_port, startup_predicates, &ctx) .await .unwrap_or_else(|e| { std::fs::remove_dir_all(&working_dir).unwrap(); @@ -388,6 +426,8 @@ async fn setup_stacks_chainhook_test( #[test_case(5, 0, Some(1), None => using assert_streaming_status; "no predicate_end_block ends with Streaming status")] #[test_case(3, 0, Some(1), Some(5) => using assert_streaming_status; "predicate_end_block greater than chain_tip ends with Streaming status")] #[test_case(5, 3, Some(1), Some(7) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status")] +#[test_case(1, 3, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(3, 7, Some(1), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] #[test_case(0, 0, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] #[tokio::test] #[cfg_attr(not(feature = "redis_tests"), ignore)] @@ -404,7 +444,7 @@ async fn test_stacks_predicate_status_is_updated( redis_port, stacks_ingestion_port, _, - ) = setup_stacks_chainhook_test(starting_chain_tip).await; + ) = setup_stacks_chainhook_test(starting_chain_tip, None, None).await; let uuid = &get_random_uuid(); let predicate = build_stacks_payload( @@ -488,6 +528,7 @@ async fn setup_bitcoin_chainhook_test( .await .unwrap_or_else(|e| panic!("test failed with error: {e}")); + flush_redis(redis_port); let (working_dir, tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { flush_redis(redis_port); redis_process.kill().unwrap(); @@ -518,7 +559,7 @@ async fn setup_bitcoin_chainhook_test( &tsv_dir, ); - start_chainhook_service(config, chainhook_service_port, &ctx) + start_chainhook_service(config, chainhook_service_port, None, &ctx) .await .unwrap_or_else(|e| { std::fs::remove_dir_all(&working_dir).unwrap(); @@ -563,7 +604,9 @@ async fn test_bitcoin_predicate_status_is_updated( Some("regtest"), Some(json!({"scope":"block"})), None, - Some(json!({"start_block": predicate_start_block, "end_block": predicate_end_block})), + Some( + json!({"start_block": predicate_start_block, "end_block": predicate_end_block, "include_proof": true}), + ), Some(uuid), ); @@ -589,6 +632,7 @@ async fn test_bitcoin_predicate_status_is_updated( mine_burn_block( stacks_ingestion_port, bitcoin_rpc_port, + None, i + starting_chain_tip, ) .await @@ -625,13 +669,158 @@ async fn test_bitcoin_predicate_status_is_updated( result } +/// +/// ┌─> predicate start block +/// │ ┌─> reorg, predicate scans from A(3) to B(6) +/// │ │ ┌─> predicate end block (unconfirmed set) +/// A(1) -> A(2) -> A(3) -> A(4) -> A(5) │ │ ┌─> predicate status confirmed +/// \ -> B(4) -> B(5) -> B(6) -> B(7) -> B(8) -> B(9) -> B(10) -> B(11) -> B(12) +/// +/// +#[test_case(5, 3, 9, Some(2), Some(7); "ommitting start_block ends with Interrupted status")] +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn test_bitcoin_predicate_status_is_updated_with_reorg( + genesis_chain_blocks_to_mine: u64, + fork_point: u64, + fork_blocks_to_mine: u64, + predicate_start_block: Option, + predicate_end_block: Option, +) { + let starting_chain_tip = 0; + let ( + mut redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + bitcoin_rpc_port, + ) = setup_bitcoin_chainhook_test(starting_chain_tip).await; + + let uuid = &get_random_uuid(); + let predicate = build_bitcoin_payload( + Some("regtest"), + Some(json!({"scope":"block"})), + None, + Some( + json!({"start_block": predicate_start_block, "end_block": predicate_end_block, "include_proof": true}), + ), + Some(uuid), + ); + + let _ = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let genesis_branch_key = '0'; + let first_block_mined_height = starting_chain_tip + 1; + let last_block_mined_height = genesis_chain_blocks_to_mine + first_block_mined_height; + for block_height in first_block_mined_height..last_block_mined_height { + mine_burn_block( + stacks_ingestion_port, + bitcoin_rpc_port, + Some(genesis_branch_key), + block_height, + ) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + } + + sleep(Duration::new(2, 0)); + let status = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_streaming_status(status); + + let branch_key = '1'; + let first_fork_block_mined_height = fork_point + 1; + create_burn_fork_at( + stacks_ingestion_port, + bitcoin_rpc_port, + Some(branch_key), + first_fork_block_mined_height, + genesis_branch_key, + fork_point, + ) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let reorg_point = last_block_mined_height + 1; + let first_fork_block_mined_height = first_fork_block_mined_height + 1; + let last_fork_block_mined_height = first_fork_block_mined_height + fork_blocks_to_mine; + + for block_height in first_fork_block_mined_height..last_fork_block_mined_height { + mine_burn_block( + stacks_ingestion_port, + bitcoin_rpc_port, + Some(branch_key), + block_height, + ) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + if block_height == reorg_point { + sleep(Duration::new(2, 0)); + let status = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_streaming_status(status); + } + } + + sleep(Duration::new(2, 0)); + let status = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + assert_confirmed_expiration_status(status); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); +} + #[test_case(Chain::Stacks; "for stacks chain")] #[test_case(Chain::Bitcoin; "for bitcoin chain")] #[tokio::test] #[cfg_attr(not(feature = "redis_tests"), ignore)] async fn test_deregister_predicate(chain: Chain) { let (mut redis_process, working_dir, chainhook_service_port, redis_port, _, _) = match &chain { - Chain::Stacks => setup_stacks_chainhook_test(0).await, + Chain::Stacks => setup_stacks_chainhook_test(0, None, None).await, Chain::Bitcoin => setup_bitcoin_chainhook_test(0).await, }; @@ -649,7 +838,7 @@ async fn test_deregister_predicate(chain: Chain) { Some("regtest"), Some(json!({"scope":"block"})), None, - Some(json!({"start_block": 1, "end_block": 2})), + Some(json!({"start_block": 1, "end_block": 2, "include_proof": true})), Some(uuid), ), }; @@ -710,3 +899,160 @@ async fn test_deregister_predicate(chain: Chain) { flush_redis(redis_port); redis_process.kill().unwrap(); } + +#[test_case(New, 6 => using assert_confirmed_expiration_status; "preloaded predicate with new status should get scanned until completion")] +#[test_case(Scanning(ScanningData { + number_of_blocks_evaluated: 4, + number_of_blocks_to_scan: 1, + number_of_times_triggered: 0, + last_occurrence: format!("0"), + last_evaluated_block_height: 4 +}), 6 => using assert_confirmed_expiration_status; "preloaded predicate with scanning status should get scanned until completion")] +#[test_case(Streaming(StreamingData { + number_of_blocks_evaluated: 4, + number_of_times_triggered: 0, + last_occurrence: format!("0"), + last_evaluation: format!("0"), + last_evaluated_block_height: 4 +}), 6 => using assert_confirmed_expiration_status; "preloaded predicate with streaming status and last evaluated height below tip should get scanned until completion")] +#[test_case(Streaming(StreamingData { + number_of_blocks_evaluated: 5, + number_of_times_triggered: 0, + last_occurrence: format!("0"), + last_evaluation: format!("0"), + last_evaluated_block_height: 5 +}), 5 => using assert_streaming_status; "preloaded predicate with streaming status and last evaluated height at tip should be streamed")] +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn test_restarting_with_saved_predicates( + starting_status: PredicateStatus, + starting_chain_tip: u64, +) -> PredicateStatus { + let uuid = &get_random_uuid(); + let predicate = build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": 1, "end_block": 6})), + Some(uuid), + ); + let predicate = + serde_json::from_value(predicate).expect("failed to set up stacks chanhook spec for test"); + + let (mut redis_process, working_dir, chainhook_service_port, redis_port, _, _) = + setup_stacks_chainhook_test(starting_chain_tip, Some((predicate, starting_status)), None) + .await; + + await_new_scanning_status_complete(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + sleep(Duration::new(2, 0)); + let result = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + result +} + +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn it_allows_specifying_startup_predicate() { + let uuid = &get_random_uuid(); + let predicate = build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": 1, "end_block": 2})), + Some(uuid), + ); + let predicate = + serde_json::from_value(predicate).expect("failed to set up stacks chanhook spec for test"); + let startup_predicate = ChainhookFullSpecification::Stacks(predicate); + let (mut redis_process, working_dir, chainhook_service_port, redis_port, _, _) = + setup_stacks_chainhook_test(3, None, Some(vec![startup_predicate])).await; + + await_new_scanning_status_complete(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + sleep(Duration::new(2, 0)); + let result = get_predicate_status(uuid, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + assert_confirmed_expiration_status(result); +} + +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn register_predicate_responds_409_if_uuid_in_use() { + let uuid = &get_random_uuid(); + let predicate = build_stacks_payload( + Some("devnet"), + Some(json!({"scope":"block_height", "lower_than": 100})), + None, + Some(json!({"start_block": 1, "end_block": 2})), + Some(uuid), + ); + let stacks_spec = serde_json::from_value(predicate.clone()) + .expect("failed to set up stacks chanhook spec for test"); + let startup_predicate = ChainhookFullSpecification::Stacks(stacks_spec); + + let (mut redis_process, working_dir, chainhook_service_port, redis_port, _, _) = + setup_stacks_chainhook_test(3, None, Some(vec![startup_predicate])).await; + + let result = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + assert_eq!(result.get("status"), Some(&json!(409))); + + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); +} + +#[test] +fn it_generates_open_api_spec() { + let new_spec = document_predicate_api_server().unwrap(); + + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("../../docs/chainhook-openapi.json"); + let current_spec = fs::read_to_string(path).unwrap(); + + assert_eq!( + current_spec, new_spec, + "breaking change detected: open api spec has been updated" + ) +} diff --git a/components/chainhook-cli/src/service/tests/observer_tests.rs b/components/chainhook-cli/src/service/tests/observer_tests.rs new file mode 100644 index 000000000..40df05173 --- /dev/null +++ b/components/chainhook-cli/src/service/tests/observer_tests.rs @@ -0,0 +1,164 @@ +use std::{sync::mpsc::channel, thread::sleep, time::Duration}; + +use chainhook_sdk::{ + observer::{start_event_observer, EventObserverConfig}, + types::{BitcoinNetwork, StacksNodeConfig}, + utils::Context, +}; +use reqwest::Method; +use serde_json::Value; +use test_case::test_case; + +use crate::service::tests::{ + helpers::{ + build_predicates::build_stacks_payload, + mock_service::{call_observer_svc, call_ping, call_register_predicate, flush_redis}, + }, + setup_bitcoin_chainhook_test, setup_stacks_chainhook_test, +}; + +use super::helpers::{ + build_predicates::get_random_uuid, get_free_port, mock_stacks_node::create_tmp_working_dir, +}; + +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn ping_endpoint_returns_metrics() { + let ( + mut redis_process, + working_dir, + chainhook_service_port, + redis_port, + stacks_ingestion_port, + _, + ) = setup_stacks_chainhook_test(1, None, None).await; + + let uuid = &get_random_uuid(); + let predicate = build_stacks_payload(Some("devnet"), None, None, None, Some(uuid)); + let _ = call_register_predicate(&predicate, chainhook_service_port) + .await + .unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + let metrics = call_ping(stacks_ingestion_port).await.unwrap_or_else(|e| { + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); + panic!("test failed with error: {e}"); + }); + + assert_eq!(metrics.stacks.registered_predicates, 1); + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); +} + +async fn await_observer_started(port: u16) { + let mut attempts = 0; + loop { + let url = format!("http://localhost:{port}/ping"); + match call_observer_svc(&url, Method::GET, None).await { + Ok(_) => break, + Err(e) => { + if attempts > 3 { + panic!("failed to start event observer, {}", e); + } else { + attempts += 1; + sleep(Duration::new(0, 500_000_000)); + } + } + } + } +} +#[test_case("/wallet", json!({ + "method": "getaddressinfo", + "params": vec!["bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh"], + "id": "my-id", + "jsonrpc": "2.0" +}))] +#[test_case("/", json!({ + "method": "sendrawtransaction", + "params": vec!["0x0000"], + "id": "my-id", + "jsonrpc": "2.0" +}))] +#[tokio::test] +#[cfg_attr(not(feature = "redis_tests"), ignore)] +async fn bitcoin_rpc_requests_are_forwarded(endpoint: &str, body: Value) { + let (mut redis_process, working_dir, _, redis_port, stacks_ingestion_port, _) = + setup_bitcoin_chainhook_test(1).await; + + await_observer_started(stacks_ingestion_port).await; + + let url = format!("http://localhost:{stacks_ingestion_port}{endpoint}"); + let response = call_observer_svc(&url, Method::POST, Some(&body)) + .await + .unwrap(); + assert!(response.get("result").is_some()); + assert!(response.get("error").is_none()); + std::fs::remove_dir_all(&working_dir).unwrap(); + flush_redis(redis_port); + redis_process.kill().unwrap(); +} + +async fn start_and_ping_event_observer(config: EventObserverConfig, ingestion_port: u16) { + let (observer_commands_tx, observer_commands_rx) = channel(); + let logger = hiro_system_kit::log::setup_logger(); + let _guard = hiro_system_kit::log::setup_global_logger(logger.clone()); + let ctx = Context { + logger: Some(logger), + tracer: false, + }; + start_event_observer( + config, + observer_commands_tx, + observer_commands_rx, + None, + None, + ctx, + ) + .unwrap(); + await_observer_started(ingestion_port).await; +} +#[test_case("/drop_mempool_tx", Method::POST, None)] +#[test_case("/attachments/new", Method::POST, None)] +#[test_case("/mined_block", Method::POST, Some(&json!({})))] +#[test_case("/mined_microblock", Method::POST, Some(&json!({})))] +#[tokio::test] +async fn it_responds_200_for_unimplemented_endpoints( + endpoint: &str, + method: Method, + body: Option<&Value>, +) { + let ingestion_port = get_free_port().unwrap(); + let (working_dir, _tsv_dir) = create_tmp_working_dir().unwrap_or_else(|e| { + panic!("test failed with error: {e}"); + }); + let config = EventObserverConfig { + chainhook_config: None, + bitcoin_rpc_proxy_enabled: false, + ingestion_port: ingestion_port, + bitcoind_rpc_username: format!(""), + bitcoind_rpc_password: format!(""), + bitcoind_rpc_url: format!(""), + bitcoin_block_signaling: chainhook_sdk::types::BitcoinBlockSignaling::Stacks( + StacksNodeConfig { + rpc_url: format!(""), + ingestion_port: ingestion_port, + }, + ), + display_logs: false, + cache_path: working_dir, + bitcoin_network: BitcoinNetwork::Regtest, + stacks_network: chainhook_sdk::types::StacksNetwork::Devnet, + data_handler_tx: None, + }; + start_and_ping_event_observer(config, ingestion_port).await; + let url = format!("http://localhost:{ingestion_port}{endpoint}"); + let response = call_observer_svc(&url, method, body).await.unwrap(); + assert_eq!(response.get("status").unwrap(), &json!(200)); +} diff --git a/components/chainhook-cli/src/storage/mod.rs b/components/chainhook-cli/src/storage/mod.rs index 2304a722f..3c72fdb3f 100644 --- a/components/chainhook-cli/src/storage/mod.rs +++ b/components/chainhook-cli/src/storage/mod.rs @@ -61,28 +61,6 @@ pub fn open_readwrite_stacks_db_conn(base_dir: &PathBuf, _ctx: &Context) -> Resu Ok(db) } -fn get_default_bitcoin_db_file_path(base_dir: &PathBuf) -> PathBuf { - let mut destination_path = base_dir.clone(); - destination_path.push("bitcoin.rocksdb"); - destination_path -} - -pub fn open_readonly_bitcoin_db_conn(base_dir: &PathBuf, _ctx: &Context) -> Result { - let path = get_default_bitcoin_db_file_path(&base_dir); - let opts = get_db_default_options(); - let db = DB::open_for_read_only(&opts, path, false) - .map_err(|e| format!("unable to open bitcoin.rocksdb: {}", e.to_string()))?; - Ok(db) -} - -pub fn open_readwrite_bitcoin_db_conn(base_dir: &PathBuf, _ctx: &Context) -> Result { - let path = get_default_bitcoin_db_file_path(&base_dir); - let opts = get_db_default_options(); - let db = DB::open(&opts, path) - .map_err(|e| format!("unable to open bitcoin.rocksdb: {}", e.to_string()))?; - Ok(db) -} - fn get_block_key(block_identifier: &BlockIdentifier) -> [u8; 12] { let mut key = [0u8; 12]; key[..2].copy_from_slice(b"b:"); diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index f753b4869..3041c6457 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -21,27 +21,6 @@ impl ChainhookConfig { } } - pub fn get_spec_with_uuid(&self, uuid: &str) -> Option { - let res = self - .stacks_chainhooks - .iter() - .filter(|spec| spec.uuid.eq(&uuid)) - .collect::>(); - if let Some(spec) = res.first() { - return Some(ChainhookSpecification::Stacks((*spec).clone())); - } - - let res = self - .bitcoin_chainhooks - .iter() - .filter(|spec| spec.uuid.eq(&uuid)) - .collect::>(); - if let Some(spec) = res.first() { - return Some(ChainhookSpecification::Bitcoin((*spec).clone())); - } - None - } - pub fn register_full_specification( &mut self, networks: (&BitcoinNetwork, &StacksNetwork), @@ -182,13 +161,6 @@ pub enum ChainhookSpecification { } impl ChainhookSpecification { - pub fn name(&self) -> &str { - match &self { - Self::Bitcoin(data) => &data.name, - Self::Stacks(data) => &data.name, - } - } - pub fn either_stx_or_btc_key(uuid: &str) -> String { format!("predicate:{}", uuid) } @@ -220,25 +192,6 @@ impl ChainhookSpecification { Self::Stacks(data) => &data.uuid, } } - - pub fn validate(&self) -> Result<(), String> { - match &self { - Self::Bitcoin(data) => { - let _ = data.action.validate()?; - } - Self::Stacks(data) => { - let _ = data.action.validate()?; - } - } - Ok(()) - } - - pub fn start_block(&self) -> Option { - match &self { - Self::Bitcoin(data) => data.start_block, - Self::Stacks(data) => data.start_block, - } - } } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index 573babf1b..f2f6b0884 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -17,7 +17,6 @@ use chainhook_types::{ StacksBlockCommitmentData, TransactionIdentifier, TransferSTXData, }; use hiro_system_kit::slog; -use rand::{thread_rng, Rng}; use reqwest::Client as HttpClient; use serde::Deserialize; @@ -230,124 +229,6 @@ pub async fn retrieve_block_hash( Ok(block_hash) } -pub async fn try_fetch_block_bytes_with_retry( - http_client: HttpClient, - block_height: u64, - bitcoin_config: BitcoinConfig, - ctx: Context, -) -> Result, String> { - let block_hash = - retrieve_block_hash_with_retry(&http_client, &block_height, &bitcoin_config, &ctx) - .await - .unwrap(); - - let mut errors_count = 0; - - let response = loop { - match fetch_block(&http_client, &block_hash, &bitcoin_config, &ctx).await { - Ok(result) => break result, - Err(_e) => { - errors_count += 1; - if errors_count > 1 { - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable to fetch block #{block_hash}: will retry in a few seconds (attempt #{errors_count}).", - ) - }); - } - std::thread::sleep(std::time::Duration::from_millis(1500)); - continue; - } - } - }; - Ok(response) -} - -pub async fn try_download_block_bytes_with_retry( - http_client: HttpClient, - block_height: u64, - bitcoin_config: BitcoinConfig, - ctx: Context, -) -> Result, String> { - let block_hash = - retrieve_block_hash_with_retry(&http_client, &block_height, &bitcoin_config, &ctx) - .await - .unwrap(); - - let mut errors_count = 0; - - let response = loop { - match download_block(&http_client, &block_hash, &bitcoin_config, &ctx).await { - Ok(result) => break result, - Err(_e) => { - errors_count += 1; - if errors_count > 1 { - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable to fetch block #{block_hash}: will retry in a few seconds (attempt #{errors_count}).", - ) - }); - } - std::thread::sleep(std::time::Duration::from_millis(1500)); - continue; - } - } - }; - Ok(response) -} - -pub async fn download_block_with_retry( - http_client: &HttpClient, - block_hash: &str, - bitcoin_config: &BitcoinConfig, - ctx: &Context, -) -> Result { - let mut errors_count = 0; - let mut backoff: f64 = 1.0; - let mut rng = thread_rng(); - - let block = loop { - let response = { - match download_block(http_client, block_hash, bitcoin_config, ctx).await { - Ok(result) => result, - Err(_e) => { - errors_count += 1; - backoff = 2.0 * backoff + (backoff * rng.gen_range(0.0..1.0)); - let duration = std::time::Duration::from_millis((backoff * 1_000.0) as u64); - if errors_count > 1 { - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable to fetch block #{block_hash}: will retry in a few seconds (attempt #{errors_count}).", - ) - }); - } - std::thread::sleep(duration); - continue; - } - } - }; - - match parse_downloaded_block(response) { - Ok(result) => break result, - Err(e) => { - errors_count += 1; - ctx.try_log(|logger| { - slog::warn!( - logger, - "unable to parse fetched block #{block_hash}: will retry in a few seconds (attempt #{errors_count}) ({e})", - ) - }); - std::thread::sleep(std::time::Duration::from_millis(500)); - continue; - } - }; - }; - Ok(block) -} - pub async fn download_block( http_client: &HttpClient, block_hash: &str, @@ -386,35 +267,6 @@ pub fn parse_downloaded_block( Ok(block) } -pub async fn fetch_block( - http_client: &HttpClient, - block_hash: &str, - bitcoin_config: &BitcoinConfig, - _ctx: &Context, -) -> Result, String> { - let block = http_client - .get(format!( - "{}/rest/block/{}.json", - bitcoin_config.rpc_url, block_hash - )) - .header("Content-Type", "application/json") - .header("Host", &bitcoin_config.rpc_url[7..]) - .send() - .await - .map_err(|e| format!("unable to send request ({})", e))? - .bytes() - .await - .map_err(|e| format!("unable to get bytes ({})", e))? - .to_vec(); - Ok(block) -} - -pub fn parse_fetched_block(downloaded_block: Vec) -> Result { - let block = serde_json::from_slice::(&downloaded_block[..]) - .map_err(|e: serde_json::Error| format!("unable to parse block ({})", e))?; - Ok(block) -} - pub async fn download_and_parse_block( http_client: &HttpClient, block_hash: &str, diff --git a/components/chainhook-sdk/src/indexer/mod.rs b/components/chainhook-sdk/src/indexer/mod.rs index 899992972..fbf580b20 100644 --- a/components/chainhook-sdk/src/indexer/mod.rs +++ b/components/chainhook-sdk/src/indexer/mod.rs @@ -49,7 +49,7 @@ impl BitcoinChainContext { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct IndexerConfig { pub bitcoin_network: BitcoinNetwork, pub stacks_network: StacksNetwork, diff --git a/components/chainhook-sdk/src/indexer/stacks/tests.rs b/components/chainhook-sdk/src/indexer/stacks/tests.rs index 84665a1be..0793b8602 100644 --- a/components/chainhook-sdk/src/indexer/stacks/tests.rs +++ b/components/chainhook-sdk/src/indexer/stacks/tests.rs @@ -1,4 +1,17 @@ -use super::super::tests::{helpers, process_stacks_blocks_and_check_expectations}; +use chainhook_types::{ + DataMapDeleteEventData, DataMapInsertEventData, DataMapUpdateEventData, DataVarSetEventData, + FTBurnEventData, FTMintEventData, FTTransferEventData, NFTBurnEventData, NFTMintEventData, + NFTTransferEventData, STXBurnEventData, STXLockEventData, STXMintEventData, + STXTransferEventData, SmartContractEventData, StacksTransactionEvent, +}; + +use crate::indexer::tests::helpers::stacks_events::create_new_event_from_stacks_event; + +use super::{ + super::tests::{helpers, process_stacks_blocks_and_check_expectations}, + NewEvent, +}; +use test_case::test_case; #[test] fn test_stacks_vector_001() { @@ -259,3 +272,116 @@ fn test_stacks_vector_051() { fn test_stacks_vector_052() { process_stacks_blocks_and_check_expectations(helpers::stacks_shapes::get_vector_052()); } + +#[test_case(StacksTransactionEvent::STXTransferEvent(STXTransferEventData { + sender: format!(""), + recipient: format!(""), + amount: format!("1"), +}); "stx_transfer")] +#[test_case(StacksTransactionEvent::STXMintEvent(STXMintEventData { + recipient: format!(""), + amount: format!("1"), +}); "stx_mint")] +#[test_case(StacksTransactionEvent::STXBurnEvent(STXBurnEventData { + sender: format!(""), + amount: format!("1"), +}); "stx_burn")] +#[test_case(StacksTransactionEvent::STXLockEvent(STXLockEventData { + locked_amount: format!("1"), + unlock_height: format!(""), + locked_address: format!(""), +}); "stx_lock")] +#[test_case(StacksTransactionEvent::NFTTransferEvent(NFTTransferEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + sender: format!(""), + recipient: format!(""), +}); "nft_transfer")] +#[test_case(StacksTransactionEvent::NFTMintEvent(NFTMintEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + recipient: format!(""), +}); "nft_mint")] +#[test_case(StacksTransactionEvent::NFTBurnEvent(NFTBurnEventData { + asset_class_identifier: format!(""), + hex_asset_identifier: format!(""), + sender: format!(""), +}); "nft_burn")] +#[test_case(StacksTransactionEvent::FTTransferEvent(FTTransferEventData { + asset_class_identifier: format!(""), + sender: format!(""), + recipient: format!(""), + amount: format!("1"), +}); "ft_transfer")] +#[test_case(StacksTransactionEvent::FTMintEvent(FTMintEventData { + asset_class_identifier: format!(""), + recipient: format!(""), + amount: format!("1"), +}); "ft_mint")] +#[test_case(StacksTransactionEvent::FTBurnEvent(FTBurnEventData { + asset_class_identifier: format!(""), + sender: format!(""), + amount: format!("1"), +}); "ft_burn")] +#[test_case(StacksTransactionEvent::DataVarSetEvent(DataVarSetEventData { + contract_identifier: format!(""), + var: format!(""), + hex_new_value: format!(""), +}); "data_var_set")] +#[test_case(StacksTransactionEvent::DataMapInsertEvent(DataMapInsertEventData { + contract_identifier: format!(""), + hex_inserted_key: format!(""), + hex_inserted_value: format!(""), + map: format!("") +}); "data_map_insert")] +#[test_case(StacksTransactionEvent::DataMapUpdateEvent(DataMapUpdateEventData { + contract_identifier: format!(""), + hex_new_value: format!(""), + hex_key: format!(""), + map: format!("") +}); "data_map_update")] +#[test_case(StacksTransactionEvent::DataMapDeleteEvent(DataMapDeleteEventData { + contract_identifier: format!(""), + hex_deleted_key: format!(""), + map: format!("") +}); "data_map_delete")] +#[test_case(StacksTransactionEvent::SmartContractEvent(SmartContractEventData { + contract_identifier: format!(""), + topic: format!("print"), + hex_value: format!(""), +}); "smart_contract_print_event")] +fn new_events_can_be_converted_into_chainhook_event(original_event: StacksTransactionEvent) { + let new_event = create_new_event_from_stacks_event(original_event.clone()); + let event = new_event.into_chainhook_event().unwrap(); + let original_event_serialized = serde_json::to_string(&original_event).unwrap(); + let event_serialized = serde_json::to_string(&event).unwrap(); + assert_eq!(original_event_serialized, event_serialized); +} + +#[test] +fn into_chainhook_event_rejects_invalid_missing_event() { + let new_event = NewEvent { + txid: format!(""), + committed: false, + event_index: 0, + event_type: format!(""), + stx_transfer_event: None, + stx_mint_event: None, + stx_burn_event: None, + stx_lock_event: None, + nft_transfer_event: None, + nft_mint_event: None, + nft_burn_event: None, + ft_transfer_event: None, + ft_mint_event: None, + ft_burn_event: None, + data_var_set_event: None, + data_map_insert_event: None, + data_map_update_event: None, + data_map_delete_event: None, + contract_event: None, + }; + new_event + .into_chainhook_event() + .expect_err("expected error on missing event"); +} diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/mod.rs b/components/chainhook-sdk/src/indexer/tests/helpers/mod.rs index bb49fc4ed..f6e8ce4d4 100644 --- a/components/chainhook-sdk/src/indexer/tests/helpers/mod.rs +++ b/components/chainhook-sdk/src/indexer/tests/helpers/mod.rs @@ -7,6 +7,7 @@ pub mod bitcoin_shapes; pub mod microblocks; #[allow(non_snake_case, unreachable_code)] pub mod stacks_blocks; +pub mod stacks_events; pub mod stacks_shapes; pub mod transactions; diff --git a/components/chainhook-sdk/src/indexer/tests/helpers/stacks_events.rs b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_events.rs new file mode 100644 index 000000000..2e1650248 --- /dev/null +++ b/components/chainhook-sdk/src/indexer/tests/helpers/stacks_events.rs @@ -0,0 +1,118 @@ +use chainhook_types::StacksTransactionEvent; + +use crate::indexer::stacks::NewEvent; + +pub fn create_new_event_from_stacks_event(event: StacksTransactionEvent) -> NewEvent { + let mut event_type = String::new(); + let stx_transfer_event = if let StacksTransactionEvent::STXTransferEvent(data) = &event { + event_type = format!("stx_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_mint_event = if let StacksTransactionEvent::STXMintEvent(data) = &event { + event_type = format!("stx_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_burn_event = if let StacksTransactionEvent::STXBurnEvent(data) = &event { + event_type = format!("stx_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let stx_lock_event = if let StacksTransactionEvent::STXLockEvent(data) = &event { + event_type = format!("stx_lock"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_transfer_event = if let StacksTransactionEvent::NFTTransferEvent(data) = &event { + event_type = format!("nft_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_mint_event = if let StacksTransactionEvent::NFTMintEvent(data) = &event { + event_type = format!("nft_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let nft_burn_event = if let StacksTransactionEvent::NFTBurnEvent(data) = &event { + event_type = format!("nft_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_transfer_event = if let StacksTransactionEvent::FTTransferEvent(data) = &event { + event_type = format!("ft_transfer"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_mint_event = if let StacksTransactionEvent::FTMintEvent(data) = &event { + event_type = format!("ft_mint"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let ft_burn_event = if let StacksTransactionEvent::FTBurnEvent(data) = &event { + event_type = format!("ft_burn"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let data_var_set_event = if let StacksTransactionEvent::DataVarSetEvent(data) = &event { + event_type = format!("data_var_set"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let data_map_insert_event = if let StacksTransactionEvent::DataMapInsertEvent(data) = &event { + event_type = format!("data_map_insert"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let data_map_update_event = if let StacksTransactionEvent::DataMapUpdateEvent(data) = &event { + event_type = format!("data_map_update"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let data_map_delete_event = if let StacksTransactionEvent::DataMapDeleteEvent(data) = &event { + event_type = format!("data_map_delete"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + let contract_event = if let StacksTransactionEvent::SmartContractEvent(data) = &event { + event_type = format!("smart_contract_print_event"); + Some(serde_json::to_value(data).unwrap()) + } else { + None + }; + NewEvent { + txid: format!(""), + committed: false, + event_index: 0, + event_type, + stx_transfer_event, + stx_mint_event, + stx_burn_event, + stx_lock_event, + nft_transfer_event, + nft_mint_event, + nft_burn_event, + ft_transfer_event, + ft_mint_event, + ft_burn_event, + data_var_set_event, + data_map_insert_event, + data_map_update_event, + data_map_delete_event, + contract_event, + } +} diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 0c602ddac..10516a2e6 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -136,67 +136,6 @@ impl EventObserverConfig { _ => unreachable!(), } } - - pub fn new_using_overrides( - overrides: Option<&EventObserverConfigOverrides>, - ) -> Result { - let bitcoin_network = - if let Some(network) = overrides.and_then(|c| c.bitcoin_network.as_ref()) { - BitcoinNetwork::from_str(network)? - } else { - BitcoinNetwork::Regtest - }; - - let stacks_network = - if let Some(network) = overrides.and_then(|c| c.stacks_network.as_ref()) { - StacksNetwork::from_str(network)? - } else { - StacksNetwork::Devnet - }; - - let config = EventObserverConfig { - bitcoin_rpc_proxy_enabled: false, - chainhook_config: None, - ingestion_port: overrides - .and_then(|c| c.ingestion_port) - .unwrap_or(DEFAULT_INGESTION_PORT), - bitcoind_rpc_username: overrides - .and_then(|c| c.bitcoind_rpc_username.clone()) - .unwrap_or("devnet".to_string()), - bitcoind_rpc_password: overrides - .and_then(|c| c.bitcoind_rpc_password.clone()) - .unwrap_or("devnet".to_string()), - bitcoind_rpc_url: overrides - .and_then(|c| c.bitcoind_rpc_url.clone()) - .unwrap_or("http://localhost:18443".to_string()), - bitcoin_block_signaling: overrides - .and_then(|c| match c.bitcoind_zmq_url.as_ref() { - Some(url) => Some(BitcoinBlockSignaling::ZeroMQ(url.clone())), - None => Some(BitcoinBlockSignaling::Stacks( - StacksNodeConfig::default_localhost( - overrides - .and_then(|c| c.ingestion_port) - .unwrap_or(DEFAULT_INGESTION_PORT), - ), - )), - }) - .unwrap_or(BitcoinBlockSignaling::Stacks( - StacksNodeConfig::default_localhost( - overrides - .and_then(|c| c.ingestion_port) - .unwrap_or(DEFAULT_INGESTION_PORT), - ), - )), - display_logs: overrides.and_then(|c| c.display_logs).unwrap_or(false), - cache_path: overrides - .and_then(|c| c.cache_path.clone()) - .unwrap_or("cache".to_string()), - bitcoin_network, - stacks_network, - data_handler_tx: None, - }; - Ok(config) - } } #[derive(Deserialize, Debug)] @@ -354,14 +293,14 @@ impl ChainhookStore { } } -#[derive(Debug, Default, Serialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct ReorgMetrics { timestamp: i64, applied_blocks: usize, rolled_back_blocks: usize, } -#[derive(Debug, Default, Serialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct ChainMetrics { pub tip_height: u64, pub last_reorg: Option, @@ -377,7 +316,7 @@ impl ChainMetrics { } } -#[derive(Debug, Default, Serialize, Clone)] +#[derive(Debug, Default, Serialize, Deserialize, Clone)] pub struct ObserverMetrics { pub bitcoin: ChainMetrics, pub stacks: ChainMetrics, diff --git a/components/chainhook-types-rs/src/rosetta.rs b/components/chainhook-types-rs/src/rosetta.rs index 543994e17..8e2f2b2fb 100644 --- a/components/chainhook-types-rs/src/rosetta.rs +++ b/components/chainhook-types-rs/src/rosetta.rs @@ -897,13 +897,13 @@ impl BitcoinNetwork { } } -#[derive(Deserialize, Debug, Clone)] +#[derive(Deserialize, Debug, Clone, PartialEq)] pub enum BitcoinBlockSignaling { Stacks(StacksNodeConfig), ZeroMQ(String), } -#[derive(Deserialize, Debug, Clone)] +#[derive(Deserialize, Debug, Clone, PartialEq)] pub struct StacksNodeConfig { pub rpc_url: String, pub ingestion_port: u16, diff --git a/docs/chainhook-openapi.json b/docs/chainhook-openapi.json index 8f0c72e9d..f70b80179 100644 --- a/docs/chainhook-openapi.json +++ b/docs/chainhook-openapi.json @@ -837,6 +837,10 @@ "type": "boolean", "nullable": true }, + "include_contract_abi": { + "type": "boolean", + "nullable": true + }, "if_this": { "$ref": "#/components/schemas/StacksPredicate" }, From ec76f29dd95818f2645f04d61ebaf3a8af1bad87 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 4 Oct 2023 10:38:37 -0400 Subject: [PATCH 60/99] fix: correctly calculate evaluations for predicate status (#424) ### Description Previously, when the unconfirmed predicate status was set after the status originally was scanning, we were adding the number of evaluated blocks with the previous statuses number of blocks. When scanning, we have a running total of blocks scanned, so we don't need to use the previously stored data. --- ### Checklist - [x] All tests pass - [x] Tests added in this PR (if applicable) --- components/chainhook-cli/src/scan/bitcoin.rs | 18 +-- components/chainhook-cli/src/scan/stacks.rs | 18 +-- components/chainhook-cli/src/service/mod.rs | 9 +- .../chainhook-cli/src/service/tests/mod.rs | 121 +++++++++++++----- 4 files changed, 112 insertions(+), 54 deletions(-) diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 7bee59e44..3ca2f4201 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -219,6 +219,15 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( ); if let Some(ref mut predicates_db_conn) = predicates_db_conn { + set_predicate_scanning_status( + &predicate_spec.key(), + number_of_blocks_to_scan, + number_of_blocks_scanned, + number_of_times_triggered, + last_block_scanned.index, + predicates_db_conn, + ctx, + ); if let Some(predicate_end_block) = predicate_spec.end_block { if predicate_end_block == last_block_scanned.index { // todo: we need to find a way to check if this block is confirmed @@ -237,15 +246,6 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( return Ok(true); } } - set_predicate_scanning_status( - &predicate_spec.key(), - number_of_blocks_to_scan, - number_of_blocks_scanned, - number_of_times_triggered, - last_block_scanned.index, - predicates_db_conn, - ctx, - ); } return Ok(false); diff --git a/components/chainhook-cli/src/scan/stacks.rs b/components/chainhook-cli/src/scan/stacks.rs index 79dc6cff4..1341f73c4 100644 --- a/components/chainhook-cli/src/scan/stacks.rs +++ b/components/chainhook-cli/src/scan/stacks.rs @@ -377,6 +377,15 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( ); if let Some(ref mut predicates_db_conn) = predicates_db_conn { + set_predicate_scanning_status( + &predicate_spec.key(), + number_of_blocks_to_scan, + number_of_blocks_scanned, + number_of_times_triggered, + last_block_scanned.index, + predicates_db_conn, + ctx, + ); if let Some(predicate_end_block) = predicate_spec.end_block { if predicate_end_block == last_block_scanned.index { let is_confirmed = match get_stacks_block_at_block_height( @@ -412,15 +421,6 @@ pub async fn scan_stacks_chainstate_via_rocksdb_using_predicate( return Ok((last_block_scanned, true)); } } - set_predicate_scanning_status( - &predicate_spec.key(), - number_of_blocks_to_scan, - number_of_blocks_scanned, - number_of_times_triggered, - last_block_scanned.index, - predicates_db_conn, - ctx, - ); } Ok((last_block_scanned, false)) } diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index 351da3aca..c9c656a0a 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -838,9 +838,7 @@ pub fn set_predicate_scanning_status( ); } -/// Updates a predicate's status to `InitialScanCompleted`. -/// -/// Preserves the scanning metrics from the predicate's previous status +/// Updates a predicate's status to `UnconfirmedExpiration`. pub fn set_unconfirmed_expiration_status( chain: &Chain, number_of_new_blocks_evaluated: u64, @@ -860,12 +858,12 @@ pub fn set_unconfirmed_expiration_status( Some(status) => match status { PredicateStatus::Scanning(ScanningData { number_of_blocks_to_scan: _, - number_of_blocks_evaluated, + number_of_blocks_evaluated: _, number_of_times_triggered, last_occurrence, last_evaluated_block_height, }) => ( - number_of_blocks_evaluated + number_of_new_blocks_evaluated, + number_of_new_blocks_evaluated, number_of_times_triggered, last_occurrence, last_evaluated_block_height, @@ -1042,7 +1040,6 @@ pub fn update_predicate_status( ctx: &Context, ) { let serialized_status = json!(status).to_string(); - println!("serialized predicate status {serialized_status}"); if let Err(e) = predicates_db_conn.hset::<_, _, _, ()>(&predicate_key, "status", &serialized_status) { diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index 44bad7e1d..09f12e212 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -261,27 +261,84 @@ async fn it_handles_stacks_predicates_with_filters(filters: JsonValue) { } } -fn assert_confirmed_expiration_status(status: PredicateStatus) { +fn assert_confirmed_expiration_status( + (status, expected_evaluations, expected_occurrences): ( + PredicateStatus, + Option, + Option, + ), +) { match status { - PredicateStatus::ConfirmedExpiration(_) => {} + PredicateStatus::ConfirmedExpiration(data) => { + if let Some(expected) = expected_evaluations { + assert_eq!( + data.number_of_blocks_evaluated, expected, + "incorrect number of blocks evaluated" + ); + } + if let Some(expected) = expected_occurrences { + assert_eq!( + data.number_of_times_triggered, expected, + "incorrect number of predicates triggered" + ); + } + } _ => panic!("expected ConfirmedExpiration status, found {:?}", status), } } -fn assert_unconfirmed_expiration_status(status: PredicateStatus) { +fn assert_unconfirmed_expiration_status( + (status, expected_evaluations, expected_occurrences): ( + PredicateStatus, + Option, + Option, + ), +) { match status { - PredicateStatus::UnconfirmedExpiration(_) => {} + PredicateStatus::UnconfirmedExpiration(data) => { + if let Some(expected) = expected_evaluations { + assert_eq!( + data.number_of_blocks_evaluated, expected, + "incorrect number of blocks evaluated" + ); + } + if let Some(expected) = expected_occurrences { + assert_eq!( + data.number_of_times_triggered, expected, + "incorrect number of predicates triggered" + ); + } + } _ => panic!("expected UnconfirmedExpiration status, found {:?}", status), } } -fn assert_streaming_status(status: PredicateStatus) { +fn assert_streaming_status( + (status, expected_evaluations, expected_occurrences): ( + PredicateStatus, + Option, + Option, + ), +) { match status { - PredicateStatus::Streaming(_) => {} + PredicateStatus::Streaming(data) => { + if let Some(expected) = expected_evaluations { + assert_eq!( + data.number_of_blocks_evaluated, expected, + "incorrect number of blocks evaluated" + ); + } + if let Some(expected) = expected_occurrences { + assert_eq!( + data.number_of_times_triggered, expected, + "incorrect number of predicates triggered" + ); + } + } _ => panic!("expected Streaming status, found {:?}", status), } } -fn assert_interrupted_status(status: PredicateStatus) { +fn assert_interrupted_status((status, _, _): (PredicateStatus, Option, Option)) { match status { PredicateStatus::Interrupted(_) => {} _ => panic!("expected Interrupted status, found {:?}", status), @@ -422,13 +479,13 @@ async fn setup_stacks_chainhook_test( ) } -#[test_case(5, 0, Some(1), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status")] -#[test_case(5, 0, Some(1), None => using assert_streaming_status; "no predicate_end_block ends with Streaming status")] -#[test_case(3, 0, Some(1), Some(5) => using assert_streaming_status; "predicate_end_block greater than chain_tip ends with Streaming status")] -#[test_case(5, 3, Some(1), Some(7) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status")] -#[test_case(1, 3, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] -#[test_case(3, 7, Some(1), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] -#[test_case(0, 0, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] +#[test_case(5, 0, Some(1), Some(3), Some(3), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip ends with ConfirmedExpiration status")] +#[test_case(5, 0, Some(1), None, Some(5), Some(5) => using assert_streaming_status; "no predicate_end_block ends with Streaming status")] +#[test_case(3, 0, Some(1), Some(5), Some(3), Some(3) => using assert_streaming_status; "predicate_end_block greater than chain_tip ends with Streaming status")] +#[test_case(5, 4, Some(1), Some(7), Some(9), Some(7) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining until end_block ends with UnconfirmedExpiration status")] +#[test_case(1, 3, Some(1), Some(3), Some(4), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(3, 7, Some(1), Some(4), Some(9), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] +#[test_case(0, 0, None, None, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] #[tokio::test] #[cfg_attr(not(feature = "redis_tests"), ignore)] async fn test_stacks_predicate_status_is_updated( @@ -436,7 +493,9 @@ async fn test_stacks_predicate_status_is_updated( blocks_to_mine: u64, predicate_start_block: Option, predicate_end_block: Option, -) -> PredicateStatus { + expected_evaluations: Option, + expected_occurrences: Option, +) -> (PredicateStatus, Option, Option) { let ( mut redis_process, working_dir, @@ -449,7 +508,7 @@ async fn test_stacks_predicate_status_is_updated( let uuid = &get_random_uuid(); let predicate = build_stacks_payload( Some("devnet"), - Some(json!({"scope":"block_height", "lower_than": 100})), + Some(json!({"scope":"block_height", "lower_than": 600})), None, Some(json!({"start_block": predicate_start_block, "end_block": predicate_end_block})), Some(uuid), @@ -510,7 +569,7 @@ async fn test_stacks_predicate_status_is_updated( std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); redis_process.kill().unwrap(); - result + (result, expected_evaluations, expected_occurrences) } async fn setup_bitcoin_chainhook_test( @@ -577,11 +636,11 @@ async fn setup_bitcoin_chainhook_test( ) } -#[test_case(5, 1, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] -#[test_case(10, 1, Some(1), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] -#[test_case(1, 3, Some(1), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] -#[test_case(3, 7, Some(1), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] -#[test_case(0, 0, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] +#[test_case(5, 1, Some(1), Some(3), Some(3), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(10, 1, Some(1), Some(3), Some(3), Some(3) => using assert_confirmed_expiration_status; "predicate_end_block lower than starting_chain_tip with predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] +#[test_case(1, 3, Some(1), Some(3), Some(4), Some(3) => using assert_unconfirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations < CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with UnconfirmedExpiration status")] +#[test_case(3, 7, Some(1), Some(4), Some(9), Some(4) => using assert_confirmed_expiration_status; "predicate_end_block greater than starting_chain_tip and mining blocks so that predicate_end_block confirmations >= CONFIRMED_SEGMENT_MINIMUM_LENGTH ends with ConfirmedExpiration status")] +#[test_case(0, 0, None, None, None, None => using assert_interrupted_status; "ommitting start_block ends with Interrupted status")] #[tokio::test] #[cfg_attr(not(feature = "redis_tests"), ignore)] async fn test_bitcoin_predicate_status_is_updated( @@ -589,7 +648,9 @@ async fn test_bitcoin_predicate_status_is_updated( blocks_to_mine: u64, predicate_start_block: Option, predicate_end_block: Option, -) -> PredicateStatus { + expected_evaluations: Option, + expected_occurrences: Option, +) -> (PredicateStatus, Option, Option) { let ( mut redis_process, working_dir, @@ -666,7 +727,7 @@ async fn test_bitcoin_predicate_status_is_updated( std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); redis_process.kill().unwrap(); - result + (result, expected_evaluations, expected_occurrences) } /// @@ -745,7 +806,7 @@ async fn test_bitcoin_predicate_status_is_updated_with_reorg( redis_process.kill().unwrap(); panic!("test failed with error: {e}"); }); - assert_streaming_status(status); + assert_streaming_status((status, None, None)); let branch_key = '1'; let first_fork_block_mined_height = fork_point + 1; @@ -793,7 +854,7 @@ async fn test_bitcoin_predicate_status_is_updated_with_reorg( redis_process.kill().unwrap(); panic!("test failed with error: {e}"); }); - assert_streaming_status(status); + assert_streaming_status((status, None, None)); } } @@ -807,7 +868,7 @@ async fn test_bitcoin_predicate_status_is_updated_with_reorg( panic!("test failed with error: {e}"); }); - assert_confirmed_expiration_status(status); + assert_confirmed_expiration_status((status, None, None)); std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); @@ -927,7 +988,7 @@ async fn test_deregister_predicate(chain: Chain) { async fn test_restarting_with_saved_predicates( starting_status: PredicateStatus, starting_chain_tip: u64, -) -> PredicateStatus { +) -> (PredicateStatus, Option, Option) { let uuid = &get_random_uuid(); let predicate = build_stacks_payload( Some("devnet"), @@ -965,7 +1026,7 @@ async fn test_restarting_with_saved_predicates( std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); redis_process.kill().unwrap(); - result + (result, None, None) } #[tokio::test] @@ -1007,7 +1068,7 @@ async fn it_allows_specifying_startup_predicate() { std::fs::remove_dir_all(&working_dir).unwrap(); flush_redis(redis_port); redis_process.kill().unwrap(); - assert_confirmed_expiration_status(result); + assert_confirmed_expiration_status((result, None, None)); } #[tokio::test] From 10d64758b0082c22fc17007f404f48152c2fc207 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 4 Oct 2023 11:24:21 -0400 Subject: [PATCH 61/99] fix: make predicate status timestamps optional (#425) ### Description This changes the predicate status timestamps: - from String (converted from a u128) to a u64 - this means we are now storing the data in seconds rather than milliseconds - makes them optional (so they will not appear in a serialized status if set to `None`) #### Breaking change? Previously the timestamp was in milliseconds, now it's in seconds. Anyone depending on the timestamp being in milliseconds could be impacted by this change. --- ### Checklist - [ ] All tests pass - [ ] Tests added in this PR (if applicable) --- components/chainhook-cli/src/service/mod.rs | 43 ++++++++----------- .../chainhook-cli/src/service/tests/mod.rs | 10 ++--- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index c9c656a0a..8752e51af 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -547,21 +547,18 @@ pub enum PredicateStatus { } #[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)] -// note: last_occurrence (and other time-based fields on the status structs) originally were -// of type u128. serde can't handle deserializing u128s when using an adjacently tagged enum, -// so we're having to convert to a string. serde issue: https://github.com/serde-rs/json/issues/740 pub struct ScanningData { pub number_of_blocks_to_scan: u64, pub number_of_blocks_evaluated: u64, pub number_of_times_triggered: u64, - pub last_occurrence: String, + pub last_occurrence: Option, pub last_evaluated_block_height: u64, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct StreamingData { - pub last_occurrence: String, - pub last_evaluation: String, + pub last_occurrence: Option, + pub last_evaluation: u64, pub number_of_times_triggered: u64, pub number_of_blocks_evaluated: u64, pub last_evaluated_block_height: u64, @@ -571,7 +568,7 @@ pub struct StreamingData { pub struct ExpiredData { pub number_of_blocks_evaluated: u64, pub number_of_times_triggered: u64, - pub last_occurrence: String, + pub last_occurrence: Option, pub last_evaluated_block_height: u64, pub expired_at_block_height: u64, } @@ -664,11 +661,10 @@ fn set_predicate_streaming_status( predicates_db_conn: &mut Connection, ctx: &Context, ) { - let now_ms = SystemTime::now() + let now_secs = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Could not get current time in ms") - .as_millis() - .to_string(); + .as_secs(); let ( last_occurrence, number_of_blocks_evaluated, @@ -720,7 +716,7 @@ fn set_predicate_streaming_status( unreachable!("unreachable predicate status: {:?}", status) } }, - None => (format!("0"), 0, 0, 0), + None => (None, 0, 0, 0), } }; let ( @@ -733,7 +729,7 @@ fn set_predicate_streaming_status( last_triggered_height, triggered_count, } => ( - now_ms.clone(), + Some(now_secs.clone()), number_of_times_triggered + triggered_count, number_of_blocks_evaluated + triggered_count, last_triggered_height, @@ -759,7 +755,7 @@ fn set_predicate_streaming_status( predicate_key, PredicateStatus::Streaming(StreamingData { last_occurrence, - last_evaluation: now_ms, + last_evaluation: now_secs, number_of_times_triggered, last_evaluated_block_height, number_of_blocks_evaluated, @@ -781,47 +777,46 @@ pub fn set_predicate_scanning_status( predicates_db_conn: &mut Connection, ctx: &Context, ) { - let now_ms = SystemTime::now() + let now_secs = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("Could not get current time in ms") - .as_millis() - .to_string(); + .as_secs(); let current_status = retrieve_predicate_status(&predicate_key, predicates_db_conn); let last_occurrence = match current_status { Some(status) => match status { PredicateStatus::Scanning(scanning_data) => { if number_of_times_triggered > scanning_data.number_of_times_triggered { - now_ms + Some(now_secs) } else { scanning_data.last_occurrence } } PredicateStatus::Streaming(streaming_data) => { if number_of_times_triggered > streaming_data.number_of_times_triggered { - now_ms + Some(now_secs) } else { streaming_data.last_occurrence } } PredicateStatus::UnconfirmedExpiration(expired_data) => { if number_of_times_triggered > expired_data.number_of_times_triggered { - now_ms + Some(now_secs) } else { expired_data.last_occurrence } } PredicateStatus::New => { if number_of_times_triggered > 0 { - now_ms + Some(now_secs) } else { - format!("0") + None } } PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { unreachable!("unreachable predicate status: {:?}", status) } }, - None => format!("0"), + None => None, }; update_predicate_status( @@ -868,7 +863,7 @@ pub fn set_unconfirmed_expiration_status( last_occurrence, last_evaluated_block_height, ), - PredicateStatus::New => (0, 0, format!("0"), 0), + PredicateStatus::New => (0, 0, None, 0), PredicateStatus::Streaming(StreamingData { last_occurrence, last_evaluation: _, @@ -904,7 +899,7 @@ pub fn set_unconfirmed_expiration_status( return; } }, - None => (0, 0, format!("0"), 0), + None => (0, 0, None, 0), }; update_predicate_status( predicate_key, diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index 09f12e212..be18e9520 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -966,21 +966,21 @@ async fn test_deregister_predicate(chain: Chain) { number_of_blocks_evaluated: 4, number_of_blocks_to_scan: 1, number_of_times_triggered: 0, - last_occurrence: format!("0"), + last_occurrence: None, last_evaluated_block_height: 4 }), 6 => using assert_confirmed_expiration_status; "preloaded predicate with scanning status should get scanned until completion")] #[test_case(Streaming(StreamingData { number_of_blocks_evaluated: 4, number_of_times_triggered: 0, - last_occurrence: format!("0"), - last_evaluation: format!("0"), + last_occurrence: None, + last_evaluation: 0, last_evaluated_block_height: 4 }), 6 => using assert_confirmed_expiration_status; "preloaded predicate with streaming status and last evaluated height below tip should get scanned until completion")] #[test_case(Streaming(StreamingData { number_of_blocks_evaluated: 5, number_of_times_triggered: 0, - last_occurrence: format!("0"), - last_evaluation: format!("0"), + last_occurrence: None, + last_evaluation: 0, last_evaluated_block_height: 5 }), 5 => using assert_streaming_status; "preloaded predicate with streaming status and last evaluated height at tip should be streamed")] #[tokio::test] From 95b2dd72745dc956c1457a11beb3df3e5b98ec29 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 4 Oct 2023 14:12:10 -0400 Subject: [PATCH 62/99] fix: add nonce to serialized stacks tx (#430) Fixes #422 --- .../chainhook-sdk/src/chainhooks/stacks/mod.rs | 1 + .../tests/fixtures/stacks/testnet/occurrence.json | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 1c9eb857a..6f0cd47c5 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -544,6 +544,7 @@ fn serialize_stacks_transaction( json!(transaction.metadata.result) }, "sender": transaction.metadata.sender, + "nonce": transaction.metadata.nonce, "fee": transaction.metadata.fee, "kind": transaction.metadata.kind, "receipt": { diff --git a/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/occurrence.json b/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/occurrence.json index 53ba07e47..76b8b30d2 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/occurrence.json +++ b/components/chainhook-sdk/src/chainhooks/tests/fixtures/stacks/testnet/occurrence.json @@ -45,6 +45,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -123,6 +124,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -200,6 +202,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -278,6 +281,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -355,6 +359,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -434,6 +439,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -512,6 +518,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -590,6 +597,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -669,6 +677,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -747,6 +756,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -825,6 +835,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -903,6 +914,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -981,6 +993,7 @@ }, "type": "ContractCall" }, + "nonce": 4064, "position": { "index": 1 }, @@ -1064,6 +1077,7 @@ }, "type": "ContractDeployment" }, + "nonce": 33, "position": { "index": 1 }, From 7b4f444d858533846e779fc739637e65128aa423 Mon Sep 17 00:00:00 2001 From: max-crawford <102705427+max-crawford@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:35:07 -0700 Subject: [PATCH 63/99] Update how-to-run-chainhook-as-a-service-using-stacks.md grammar fixes --- ...run-chainhook-as-a-service-using-stacks.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md index c05a45cd3..2f1849060 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-stacks.md @@ -1,5 +1,5 @@ --- -title: Run Chainhook as a Service using Stacks +title: Run Chainhook as a Service Using Stacks --- You can run Chainhook as a service to evaluate Stacks blocks against your predicates. You can also dynamically register new predicates by enabling predicates registration API. @@ -8,13 +8,13 @@ Start with the prerequisite section and configure your files to start the chainh ## Prerequisite -### Configure Stacks Node +### Configure Your Stacks Node -- Configure your stacks node using the [Stacks node configuration](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration) documentation. -- Recommend the latest version of Stacks. You can check the latest version by following [this](https://github.com/stacks-network/stacks-blockchain/releases) link. -- Set up the bitcoin node by following [this](how-to-run-chainhook-as-a-service-using-bitcoind.md#setting-up-a-bitcoin-node) article, then get the `rpcuser`, `rpcpassword`, and `rpc_port` values defined in the `bitcoin.conf` file. +- Configure your Stacks node using the [Stacks node configuration](https://docs.stacks.co/docs/nodes-and-miners/stacks-node-configuration) documentation. +- We Recommend using the latest version of Stacks. You can check the latest version by following [this](https://github.com/stacks-network/stacks-blockchain/releases) link. +- Set up your Bitcoin node by following [this](how-to-run-chainhook-as-a-service-using-bitcoind.md#setting-up-a-bitcoin-node) article, then get the `rpcuser`, `rpcpassword`, and `rpc_port` values defined in the `bitcoin.conf` file. -A `Stacks.toml` file is generated when configuring the stacks node. Below is the sample `Stacks.toml` file. +A `Stacks.toml` file is generated when configuring your Stacks node. Below is the sample `Stacks.toml` file. ```toml [node] @@ -99,7 +99,7 @@ max_caching_memory_size_mb = 32000 tsv_file_url = "https://archive.hiro.so/mainnet/stacks-blockchain-api/mainnet-stacks-blockchain-api-latest" ``` -Ensure the following configurations are matched to allow chainhook to communicate with the Stacks and Bitcoin layers. +Ensure the following configurations are matched to allow chainhook to communicate with both Stacks and Bitcoin. | bitcoin.conf | Stacks.toml | Chainhook.toml | | --------------- | ----------- | ---------------------------- | @@ -112,11 +112,11 @@ Ensure the following configurations are matched to allow chainhook to communicat > **_NOTE:_** > -> The `bitcoind_zmq_url` is optional when running chainhook as a service using stacks because stacks will pull the blocks from Stacks and the Bitcoin chain. +> The `bitcoind_zmq_url` is optional when running chainhook as a service using Stacks because Stacks will pull the blocks from Stacks and the Bitcoin chain. -## Scan blockchain based on predicates +## Scan the blockchain based on predicates -Now that the stacks and chainhook configurations are done, you can scan your blocks by defining your [predicates](../overview.md#if-this-predicate-design). This section helps you with sample JSON files to scan the blocks in the blockchain and render the results. To understand the supported predicates for Stacks, refer to [how to use chainhook with stacks](how-to-use-chainhooks-with-stacks.md). +Now that the Stacks and Chainhook configurations are done, you can scan your blocks by defining your [predicates](../overview.md#if-this-predicate-design). This section helps you with sample JSON files to scan blockchain blocks and render the results. To understand the supported predicates for Stacks, refer to [how to use chainhook with stacks](how-to-use-chainhooks-with-stacks.md). The following are the two examples to walk you through `file_append` and `http_post` `then-that` predicate designs. @@ -178,7 +178,7 @@ A JSON file `print-event.json` is generated. > > You can get blockchain height and current block in the [Explorer](https://explorer.hiro.so/blocks?chain=mainnet). -Now, use the following command to scan the blocks based on the predicates defined in the `mainnet` network block of your `print-event.json` file. +Now, use the following command to scan the blocks based on the predicates defined in the `mainnet` network block of your `print-event.json` file: ```console chainhook predicates scan print-event.json --mainnet @@ -191,13 +191,13 @@ The output of the above command will be a text file `arkadiko.txt` generated bas ``` > **_TIP:_** -> To optimize your experience with scanning, the following are a few knobs you can play with: -> Use of adequate values for `start_block` and `end_block` in predicates will drastically improve the performance. +> To optimize your experience with scanning, there are a few variables you can play with: +> Use of adequate values for `start_block` and `end_block` in predicates will drastically improve performance. > Networking: reducing the number of network hops between the chainhook and the bitcoind processes can also help. ### Example 2 - `http_post` -Run the following command to generate a sample JSON file with predicates in your terminal. +Run the following command to generate a sample JSON file with predicates in your terminal: ```console chainhook predicates new print-event-post.json --stacks @@ -250,7 +250,7 @@ Update the generated JSON file `print-event-post.json` with the following: > > The `start_block` is the required field to use the `http_post` `then-that` predicate. -Now, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file. +Now, use the following command to scan the blocks based on the predicates defined in the `print-event-post.json` file: ```console chainhook predicates scan print-event-post.json --mainnet @@ -260,9 +260,9 @@ The above command posts events to the URL `http://localhost:3000/events` mention ## Initiate Chainhook Service -In this section, you'll learn how to initiate the chainhook service using the following two ways and use the REST API call to post the events onto a server. +In this section, you'll learn two ways to initiate the Chainhook service as well as how to use the REST API call to post the events onto a server. -- Initiate the chainhook service by passing the predicate path to the command as shown below. +- Initiate the Chainhook service by passing the predicate path to the command as shown below: ```console chainhook service start --predicate-path=print-event.json --config-path=Chainhook.toml @@ -274,7 +274,7 @@ In this section, you'll learn how to initiate the chainhook service using the fo You can also dynamically register new predicates with your Chainhook service. -First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. +First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server: ```toml # ... From 16862138a9c1f83c23c9ca045894291c82784003 Mon Sep 17 00:00:00 2001 From: max-crawford <102705427+max-crawford@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:07:55 -0700 Subject: [PATCH 64/99] Update getting-started.md couple grammar tweaks --- docs/getting-started.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 94ca44690..0f49ae187 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -9,7 +9,7 @@ Chainhook is a transaction indexing engine for Stacks and Bitcoin. It can extrac Chainhook can extract data from the Bitcoin and the Stacks blockchains using predicates (sometimes called `chainhooks`). A predicate specifies a rule applied as a filtering function on every block transaction. - **Chainhook as a development tool** has a few convenient features designed to make developers as productive as possible by allowing them to iterate quickly in their local environments. -- **Chainhook as a service** can be used to evaluate new Bitcoin and/or Stacks blocks against your predicates. You can also dynamically register new predicates by [enabling predicates registration API](./overview.md#then-that-predicate-design) +- **Chainhook as a service** can be used to evaluate new Bitcoin and/or Stacks blocks against your predicates. You can also dynamically register new predicates by [enabling predicates registration API](./overview.md#then-that-predicate-design). ## Install Chainhook from the Source @@ -21,13 +21,13 @@ Chainhook can be installed from the source by following the steps below: git clone https://github.com/hirosystems/chainhook.git ``` -2. Navigate to the root directory of the cloned repo +2. Navigate to the root directory of the cloned repo: ```bash cd chainhook ``` -3. Run cargo target to install chainhook +3. Run cargo target to install chainhook: ```bash cargo chainhook-install From fc399c17c74002d85203869bb1ed02ee8a9eac3b Mon Sep 17 00:00:00 2001 From: max-crawford <102705427+max-crawford@users.noreply.github.com> Date: Tue, 3 Oct 2023 16:49:42 -0700 Subject: [PATCH 65/99] Update overview.md Tweaked grammar and voice --- docs/overview.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index 6f82710ce..b154a4059 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -4,7 +4,7 @@ title: Overview # Chainhook Overview -Chainhook is a reorg-aware transaction indexing engine that helps developers get reliable blockchain data, regardless of forks and reorgs. By focusing only on the data devs care about, Chainhook helps developers work with much lighter datasets and build IFTTT logic into their applications. +Chainhook is a reorg-aware transaction indexing engine that helps you get reliable blockchain data, regardless of forks and reorgs. By focusing only on the data developers care about, Chainhook helps devs work with much lighter datasets and build IFTTT logic into their applications. Chainhook can be used as a tool in your local development environment and as a service in the cloud environment. @@ -18,15 +18,15 @@ With Chainhook, developers can build consistent, reorg-proof databases that inde ## Features -1. **Faster, More Efficient Indexing:** Instead of working with a generic blockchain indexer, taking hours to process every single transaction of every single block, developers can create their own indexes, build, iterate, and refine them in minutes. Chainhook can help developers avoid massive storage management and storage scaling issues by avoiding full chain indexation. Lighter indexes imply faster query results, which helps minimize end-user response time. This leads to an enhanced Developer Experience and an improved End-User Experience. +1. **Faster, More Efficient Indexing:** Instead of working with a generic blockchain indexer, taking hours to process every single transaction of every single block, you can create your own index, build, iterate, and refine it in minutes. Chainhook can help you avoid massive storage management and storage scaling issues by avoiding full chain indexation. Lighter indexes lead to faster query results, which helps minimize end-user response time. This leads to a better developer experience and a better end-user experience. 2. **Re-org and Fork Aware:** Chainhook stores possible chain forks and checks each new chain event against the forks to maintain the current valid fork. All triggers, also known as **predicates**, are evaluated against the current valid fork. In the event of a reorg, Chainhook computes a list of new blocks to apply and old blocks to rollback and evaluates the registered predicates against those blocks. -3. **IFTTT Logic, powering your applications:** Chainhook helps developers create elegant event-based architectures using triggers, also known as **predicates**. Developers can write “if_this / then_that” **predicates**that when triggered, are packaged as events and forwarded to the configured destination. By using cloud functions as destinations, developers can also cut costs on processing by only paying for processing when a block that contains some data relevant to the developer's application is being mined. +3. **IFTTT Logic, powering your applications:** Chainhook helps developers create elegant event-based architectures using triggers, also known as **predicates**. Developers can write “if_this / then_that” **predicates** that when triggered, are packaged as events and forwarded to the configured destination. By using cloud functions as destinations, developers can also cut costs on processing by only paying for processing when a block that contains some data relevant to the developer's application is being mined. ## Chainhooks: Trigger IFTTT Logic in your Application -With Chainhook, developers can trigger actions based on predicates they can define. Chainhooks can be triggered by events such as: +With Chainhook, you can trigger actions based on predicates you define. Chainhooks can be triggered by events such as: - A certain amount of SIP-10 tokens were transferred - A particular blockchain address received some tokens on the Stacks/Bitcoin blockchain From d2abeb21a871e73b4cdb1df4d5cec1d872fd1ae7 Mon Sep 17 00:00:00 2001 From: max-crawford <102705427+max-crawford@users.noreply.github.com> Date: Tue, 3 Oct 2023 17:19:58 -0700 Subject: [PATCH 66/99] Update how-to-run-chainhook-as-a-service-using-bitcoind.md grammar fixes --- ...n-chainhook-as-a-service-using-bitcoind.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md index 7eda6c03a..47b0cbc09 100644 --- a/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md +++ b/docs/how-to-guides/how-to-run-chainhook-as-a-service-using-bitcoind.md @@ -1,8 +1,8 @@ --- -title: Run Chainhook as a Service using Bitcoind +title: Run Chainhook as a Service Using Bitcoind --- -You can run Chainhook as a service to evaluate your `if_this / then_that` predicates against the Bitcoin blockchain, delivering results—either file appendations or HTTP POST requests to a server you designate—for your application's use case. You can also dynamically register new predicates as the service is running by enabling the predicates registration API. +You can run Chainhook as a service to evaluate your `if_this / then_that` predicates against the Bitcoin blockchain, delivering data—either file appendations or HTTP POST requests to a server you designate—for your application's use case. You can also dynamically register new predicates as the service is running by enabling the predicates registration API. ## Prerequisites @@ -14,11 +14,11 @@ This guide is written to work with the latest Bitcoin Core software containing b > **_NOTE:_** > -> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org [Running A Full Node guide](https://bitcoin.org/en/full-node). +> While bitcoind can and will start syncing a Bitcoin node, customizing this node to your use cases beyond supporting a Chainhook is out of scope for this guide. See the Bitcoin wiki for ["Running Bitcoin"](https://en.bitcoin.it/wiki/Running_Bitcoin) or bitcoin.org's [Running A Full Node guide](https://bitcoin.org/en/full-node). -- Make note of the path of your `bitcoind` executable (located within the `bin` directory of the `bitcoin-25.0` folder you downloaded above appropriate to your operating system) +- Make note of the path of your `bitcoind` executable (located within the `bin` directory of the `bitcoin-25.0` folder you downloaded above appropriate to your operating system). - Navigate to your project folder where your Chainhook node will reside, create a new file, and rename it to `bitcoin.conf`. Copy the configuration below to this `bitcoin.conf` file. -- Find and copy your Bitcoin data directory and paste to the `datadir` field in the `bitcoin.conf` file below. Either copy the default path (see [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory)) or copy the custom path you set for your Bitcoin data +- Find and copy your Bitcoin data directory and paste to the `datadir` field in the `bitcoin.conf` file below. Either copy the default path (see [list of default directories by operating system](https://en.bitcoin.it/wiki/Data_directory)) or copy the custom path you set for your Bitcoin data. - Set a username of your choice for bitcoind and use it in the `rpcuser` configuration below (`devnet` is a default). - Set a password of your choice for bitcoind and use it in the `rpcpassword` configuration below (`devnet` is a default). @@ -128,7 +128,7 @@ Here is a table of the relevant parameters this guide changes in our configurati ## Scan blockchain based on predicates -Now that your bitcoind and Chainhook configurations are complete, you can define the Chainhook [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks. These predicates are where the user specifies the kinds of blockchain events that trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). +Now that your bitcoind and Chainhook configurations are complete, you can define the Chainhook [predicates](../overview.md#if-this-predicate-design) you would like to scan against bitcoin blocks. These predicates are where you specify the kind of blockchain events that trigger Chainhook to deliver a result (either a file appendation or an HTTP POST request). This section helps you with an example JSON file to scan a range of blocks in the blockchain to trigger results. To understand the supported predicates for Bitcoin, refer to [how to use chainhooks with bitcoin](how-to-use-chainhooks-with-bitcoin.md). The following is an example to walk you through an `if_this / then_that` predicate design that appends event payloads to the configured file destination. @@ -232,11 +232,11 @@ The above command posts events to the URL, http://localhost:3000/events mentione ## Initiate Chainhook Service -In the examples above, our Chainhook scanned historical blockchain data against the user's predicates and delivered results. In this next section, let's learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service. +In the examples above, our Chainhook scanned historical blockchain data against predicates and delivered results. In this next section, let's learn how to set up a Chainhook that acts as an ongoing observer and event-streaming service. -We can start a Chainhook service with an existing predicate. We will also see how we can dynamically register new predicates by making an API call to our Chainhook. In both of these instances, our predicates will be delivering their results to a server set up to recieve results. +We can start a Chainhook service with an existing predicate. We can also dynamically register new predicates by making an API call to our Chainhook. In both of these instances, our predicates will be delivering their results to a server set up to receive results. -- Initiate the chainhook service by passing the predicate path to the command as shown below. +- Initiate the chainhook service by passing the predicate path to the command as shown below: ```console chainhook service start --predicate-path=stacking-pool-api.json --config-path=Chainhook.toml @@ -248,7 +248,7 @@ The above command registers the predicate based on the predicate definition in t You can also dynamically register new predicates with your Chainhook service. -First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server. +First, we need to uncomment the following lines of code in the `Chainhook.toml` file to enable the predicate registration server: ```toml # ... From 8774359de780a4e7d2460831ed602cbe9f482c7e Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Mon, 2 Oct 2023 21:22:33 +0200 Subject: [PATCH 67/99] test: refactor script evaluation test The test was designed around the OpReturn matcher only. This change generalizes it so that we can test other matchers. This is preparatory work to introduce Wallet descriptor testing. --- .../chainhook-sdk/src/chainhooks/bitcoin/tests.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs index 27698a6de..ff267dab7 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs @@ -53,9 +53,13 @@ use test_case::test_case; true; "OpReturn: EndsWith matches ASCII value" )] +fn test_opreturn_evaluation(script_pubkey: &str, rule: MatchingRule, matches: bool) { + script_pubkey_evaluation(OutputPredicate::OpReturn(rule), script_pubkey, matches) +} -fn test_script_pubkey_evaluation(script_pubkey: &str, rule: MatchingRule, matches: bool) { - let predicate = BitcoinPredicateType::Outputs(OutputPredicate::OpReturn(rule)); +// script_pubkey_evaluation is a helper that evaluates a a script_pubkey against a transaction predicate. +fn script_pubkey_evaluation(output: OutputPredicate, script_pubkey: &str, matches: bool) { + let predicate = BitcoinPredicateType::Outputs(output); let outputs = vec![TxOut { value: 0, @@ -83,5 +87,5 @@ fn test_script_pubkey_evaluation(script_pubkey: &str, rule: MatchingRule, matche tracer: false, }; - assert_eq!(matches, predicate.evaluate_transaction_predicate(&tx, &ctx),); + assert_eq!(matches, predicate.evaluate_transaction_predicate(&tx, &ctx)); } From 959da298b7cbf370e1b445bb82b50804c64d965f Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Sat, 2 Sep 2023 18:59:33 +0200 Subject: [PATCH 68/99] feat: add Wallet Descriptor Support for Transaction Indexing This introduces support for wallet descriptors. Descriptors provide a compact and semi-standardized method for describing how scripts and addresses within a wallet are generated[1]. Chainhooks users that want to track addresses derived from an extended pubkey or a multisig-wallet for example, can now rely on this feature instead of defining one predicate per address. For example if we wanted to track the first 3 addressed generated by the following descriptor: ``` wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*) ``` which reads: describe a P2WPKH output with the specified extended public key, and produces these BIP84 addresses: ``` bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj ``` we could use the following predicate: ```json ... "networks": { "regtest": { "if_this": { "scope": "outputs", "descriptor": { "expression": "wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)", "range": [0,3] } }, "then_that": { "file_append": { "path": "txns.txt" } } } } ... ``` 1: https://bitcoindevkit.org/descriptors/ --- Cargo.lock | 74 +++++++++++++++++-- .../chainhook-cli/src/service/tests/mod.rs | 1 + components/chainhook-sdk/Cargo.toml | 1 + .../src/chainhooks/bitcoin/mod.rs | 55 +++++++++++++- .../chainhook-sdk/src/chainhooks/types.rs | 27 ++++++- 5 files changed, 149 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 764fe81b8..369d4c7e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -220,10 +220,29 @@ checksum = "0694ea59225b0c5f3cb405ff3f670e4828358ed26aec49dc352f730f0cb1a8a3" dependencies = [ "bech32", "bitcoin_hashes 0.11.0", - "secp256k1", + "secp256k1 0.24.3", "serde", ] +[[package]] +name = "bitcoin" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e99ff7289b20a7385f66a0feda78af2fc119d28fb56aea8886a9cd0a4abdd75" +dependencies = [ + "bech32", + "bitcoin-private", + "bitcoin_hashes 0.12.0", + "hex_lit", + "secp256k1 0.27.0", +] + +[[package]] +name = "bitcoin-private" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" + [[package]] name = "bitcoin_hashes" version = "0.9.7" @@ -239,6 +258,15 @@ dependencies = [ "serde", ] +[[package]] +name = "bitcoin_hashes" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +dependencies = [ + "bitcoin-private", +] + [[package]] name = "bitcoincore-rpc" version = "0.16.0" @@ -258,7 +286,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c231bea28e314879c5aef240f6052e8a72a369e3c9f9b20d9bfbb33ad18029b2" dependencies = [ - "bitcoin", + "bitcoin 0.29.2", "serde", "serde_json", ] @@ -455,6 +483,7 @@ dependencies = [ "hiro-system-kit", "hyper", "lazy_static", + "miniscript", "rand 0.8.5", "regex", "reqwest", @@ -599,7 +628,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1464355d97840afd89fcc04c4361a4d06200de1ddf4a311b649744c7e67d0155" dependencies = [ "bip39", - "bitcoin", + "bitcoin 0.29.2", "chainhook-types 1.0.6", "clarinet-utils", "clarity-repl", @@ -1622,6 +1651,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex_lit" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3011d1213f159867b13cfd6ac92d2cd5f1345762c63be3554e84092d85a50bbd" + [[package]] name = "hiro-system-kit" version = "0.1.0" @@ -2205,6 +2240,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniscript" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1eb102b66b2127a872dbcc73095b7b47aeb9d92f7b03c2b2298253ffc82c7594" +dependencies = [ + "bitcoin 0.30.1", + "bitcoin-private", +] + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -3382,10 +3427,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" dependencies = [ "bitcoin_hashes 0.11.0", - "secp256k1-sys", + "secp256k1-sys 0.6.1", "serde", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "bitcoin_hashes 0.12.0", + "secp256k1-sys 0.8.1", +] + [[package]] name = "secp256k1-sys" version = "0.6.1" @@ -3395,6 +3450,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.7.0" @@ -3842,7 +3906,7 @@ dependencies = [ "rand 0.7.3", "ripemd", "rusqlite", - "secp256k1", + "secp256k1 0.24.3", "serde", "serde_derive", "serde_json", diff --git a/components/chainhook-cli/src/service/tests/mod.rs b/components/chainhook-cli/src/service/tests/mod.rs index be18e9520..fa423ab32 100644 --- a/components/chainhook-cli/src/service/tests/mod.rs +++ b/components/chainhook-cli/src/service/tests/mod.rs @@ -126,6 +126,7 @@ async fn it_handles_bitcoin_predicates_with_network(network: &str) { #[test_case(json!({ "scope": "outputs","p2sh": {"equals": "2MxDJ723HBJtEMa2a9vcsns4qztxBuC8Zb2"}}) ; "with scope outputs type p2sh")] #[test_case(json!({"scope": "outputs","p2wpkh": {"equals": "bcrt1qnxknq3wqtphv7sfwy07m7e4sr6ut9yt6ed99jg"}}) ; "with scope outputs type p2wpkh")] #[test_case(json!({"scope": "outputs","p2wsh": {"equals": "bc1qklpmx03a8qkv263gy8te36w0z9yafxplc5kwzc"}}) ; "with scope outputs type p2wsh")] +#[test_case(json!({"scope": "outputs","descriptor": {"expression": "a descriptor", "range": [0,3]}}) ; "with scope outputs type descriptor")] #[test_case(json!({"scope": "stacks_protocol","operation": "stacker_rewarded"}) ; "with scope stacks_protocol operation stacker_rewarded")] #[test_case(json!({"scope": "stacks_protocol","operation": "block_committed"}) ; "with scope stacks_protocol operation block_committed")] #[test_case(json!({"scope": "stacks_protocol","operation": "leader_registered"}) ; "with scope stacks_protocol operation leader_registered")] diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 96dd054ed..accd2c2e2 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -42,6 +42,7 @@ dashmap = "5.4.0" fxhash = "0.2.1" lazy_static = "1.4.0" regex = "1.9.3" +miniscript = "10.0.0" [dev-dependencies] test-case = "3.1.0" diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index dd17c6b07..c638ef83a 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -1,6 +1,6 @@ use super::types::{ - BitcoinChainhookSpecification, BitcoinPredicateType, ExactMatchingRule, HookAction, - InputPredicate, MatchingRule, OrdinalOperations, OutputPredicate, StacksOperations, + BitcoinChainhookSpecification, BitcoinPredicateType, DescriptorMatchingRule, ExactMatchingRule, + HookAction, InputPredicate, MatchingRule, OrdinalOperations, OutputPredicate, StacksOperations, }; use crate::utils::Context; @@ -11,6 +11,11 @@ use chainhook_types::{ StacksBaseChainOperation, TransactionIdentifier, }; +use hiro_system_kit::slog; + +use miniscript::bitcoin::secp256k1::Secp256k1; +use miniscript::Descriptor; + use reqwest::{Client, Method}; use serde_json::Value as JsonValue; use std::collections::{BTreeMap, HashMap}; @@ -326,7 +331,7 @@ impl BitcoinPredicateType { pub fn evaluate_transaction_predicate( &self, tx: &BitcoinTransactionData, - _ctx: &Context, + ctx: &Context, ) -> bool { // TODO(lgalabru): follow-up on this implementation match &self { @@ -422,6 +427,50 @@ impl BitcoinPredicateType { } false } + BitcoinPredicateType::Outputs(OutputPredicate::Descriptor( + DescriptorMatchingRule { expression, range }, + )) => { + // To derive from descriptors, we need to provide a secp context. + let (sig, ver) = (&Secp256k1::signing_only(), &Secp256k1::verification_only()); + let (desc, _) = Descriptor::parse_descriptor(&sig, expression).unwrap(); + + // If the descriptor is derivable (`has_wildcard()`), we rely on the `range` field + // defined by the predicate OR fallback to a default range of [0,5] when not set. + // When the descriptor is not derivable we force to create a unique iteration by + // ranging over [0,1]. + let range = if desc.has_wildcard() { + range.unwrap_or([0, 5]) + } else { + [0, 1] + }; + + // Derive the addresses and try to match them against the outputs. + for i in range[0]..range[1] { + let derived = desc.derived_descriptor(&ver, i).unwrap(); + + // Extract and encode the derived pubkey. + let script_pubkey = hex::encode(derived.script_pubkey().as_bytes()); + + // Match that script against the tx outputs. + for (index, output) in tx.metadata.outputs.iter().enumerate() { + if output.script_pubkey[2..] == script_pubkey { + ctx.try_log(|logger| { + slog::debug!( + logger, + "Descriptor: Matched pubkey {:?} on tx {:?} output {}", + script_pubkey, + tx.transaction_identifier.get_hash_bytes_str(), + index, + ) + }); + + return true; + } + } + } + + false + } BitcoinPredicateType::Inputs(InputPredicate::Txid(predicate)) => { // TODO(lgalabru): add support for transaction chainhing, if enabled for input in tx.metadata.inputs.iter() { diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 3041c6457..45a3476da 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use chainhook_types::{BitcoinNetwork, StacksNetwork}; use reqwest::Url; use serde::ser::{SerializeSeq, Serializer}; -use serde::{Deserialize, Serialize}; +use serde::{de, Deserialize, Deserializer, Serialize}; use schemars::JsonSchema; @@ -511,6 +511,7 @@ pub enum OutputPredicate { P2sh(ExactMatchingRule), P2wpkh(ExactMatchingRule), P2wsh(ExactMatchingRule), + Descriptor(DescriptorMatchingRule), } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] @@ -661,6 +662,30 @@ pub enum ExactMatchingRule { Equals(String), } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub struct DescriptorMatchingRule { + // expression defines the bitcoin descriptor. + pub expression: String, + #[serde(default, deserialize_with = "deserialize_descriptor_range")] + pub range: Option<[u32; 2]>, +} + +// deserialize_descriptor_range makes sure that the range value is valid. +fn deserialize_descriptor_range<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let range: [u32; 2] = Deserialize::deserialize(deserializer)?; + if !(range[0] < range[1]) { + Err(de::Error::custom( + "First element of 'range' must be lower than the second element", + )) + } else { + Ok(Some(range)) + } +} + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum BlockIdentifierHashRule { From e7f6e9207abe4aacf7da01e89fb99e986b97a6bb Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Mon, 2 Oct 2023 23:13:15 +0200 Subject: [PATCH 69/99] test: add Descriptor predicate tests --- .../src/chainhooks/bitcoin/tests.rs | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs index ff267dab7..fe9b2d12d 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/tests.rs @@ -57,6 +57,47 @@ fn test_opreturn_evaluation(script_pubkey: &str, rule: MatchingRule, matches: bo script_pubkey_evaluation(OutputPredicate::OpReturn(rule), script_pubkey, matches) } +// Descriptor test cases have been taken from +// https://github.com/bitcoin/bitcoin/blob/master/doc/descriptors.md#examples +// To generate the address run: +// `bdk-cli -n testnet wallet --descriptor get_new_address` +#[test_case( + "tb1q0ht9tyks4vh7p5p904t340cr9nvahy7um9zdem", + "wpkh(02f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9)"; + "Descriptor: P2WPKH" +)] +#[test_case( + "2NBtBzAJ84E3sTy1KooEHYVwmMhUVdJAyEa", + "sh(wpkh(03fff97bd5755eeea420453a14355235d382f6472f8568a18b2f057a1460297556))"; + "Descriptor: P2SH-P2WPKH" +)] +#[test_case( + "tb1qwu7hp9vckakyuw6htsy244qxtztrlyez4l7qlrpg68v6drgvj39qya5jch", + "wsh(multi(2,03a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7,03774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb,03d01115d548e7561b15c38f004d734633687cf4419620095bc5b0f47070afe85a))"; + "Descriptor: P2WSH 2-of-3 multisig output" +)] +fn test_descriptor_evaluation(addr: &str, expr: &str) { + // turn the address into a script_pubkey with a 0x prefix, as expected by the evaluator. + let script_pubkey = Address::from_str(addr).unwrap().script_pubkey(); + let matching_script_pubkey = format!("0x{}", hex::encode(script_pubkey)); + + let rule = DescriptorMatchingRule { + expression: expr.to_string(), + // TODO: test ranges + range: None, + }; + + // matching against the script_pubkey generated from the address should match. + script_pubkey_evaluation( + OutputPredicate::Descriptor(rule.clone()), + &matching_script_pubkey, + true, + ); + + // matching against a fake script_pubkey should not match. + script_pubkey_evaluation(OutputPredicate::Descriptor(rule.clone()), "0xffff", false); +} + // script_pubkey_evaluation is a helper that evaluates a a script_pubkey against a transaction predicate. fn script_pubkey_evaluation(output: OutputPredicate, script_pubkey: &str, matches: bool) { let predicate = BitcoinPredicateType::Outputs(output); From 5616a6abc5547293d05d179d99c281e2a937ae45 Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Mon, 2 Oct 2023 23:29:01 +0200 Subject: [PATCH 70/99] docs: update wallet description how-to --- .../how-to-use-chainhooks-with-bitcoin.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md b/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md index 1d96f21ea..8eae61b76 100644 --- a/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md +++ b/docs/how-to-guides/how-to-use-chainhooks-with-bitcoin.md @@ -152,6 +152,31 @@ Get any transaction, including a `p2wsh` output paying a given recipient: `p2wsh` (Pay-to-Witness-Script-Hash) is a Bitcoin transaction output script type used in Segregated Witness (SegWit) that enables users to send funds to a hashed script, allowing for more complex transaction conditions and greater scalability by separating the script from the transaction data. +**Wallet Descriptors** provide a compact and semi-standardized method for describing how scripts and addresses within a wallet are generated. Chainhooks users that want to track addresses derived from an extended pubkey or a multisig-wallet for example, can now rely on this feature instead of defining one predicate per address. +For example if we wanted to track the first 3 addressed generated by the following descriptor: +``` +wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*) +``` +which reads: describe a P2WPKH output with the specified extended public key, and produces these BIP84 addresses: + +``` +bcrt1qzy2rdyvu8c57qd8exyyp0mw7dk5drsu9ewzdsu +bcrt1qsfsjnagr29m8h3a3vdand2s85cg4cefkcwk2fy +bcrt1qauewfytqe5mtr0xwp786r6fl39kmum2lr65kmj +``` +The following predicate should be defined: +```json +{ + "if_this": { + "scope": "outputs", + "descriptor": { + "expression": "wpkh(tprv8ZgxMBicQKsPePxn6j3TjvB2MBzQkuhGgc6oRh2WZancZQgxktcnjZJ44XdsRiw3jNkbVTK9JW6KFHvnRKgAMtSyuBevMJprSkZ4PTfmTgV/84'/1'/0'/0/*)", + "range": [0,3] + } + } +} +``` + Get any Bitcoin transaction, including a Block commitment. Broadcasted payloads include _Proof of Transfer_ reward information: ```json From da500d7d9d6e9173c6f8e3e2f7c03b402f6a5122 Mon Sep 17 00:00:00 2001 From: deantchi <21262275+deantchi@users.noreply.github.com> Date: Thu, 5 Oct 2023 06:32:08 -0700 Subject: [PATCH 71/99] ci: update CD process (#421) changes to the CI workflow. adding auto deployments using docker container digest to the k8s repo. dev and stg will auto approve, while prod will require manual approval --------- Co-authored-by: Charlie <2747302+CharlieC3@users.noreply.github.com> --- .github/workflows/ci.yaml | 180 ++++++++++++++++++++++++++++++++++---- 1 file changed, 162 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c9a5b4a65..c1e22e7f0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -3,40 +3,62 @@ name: CI on: push: branches: - - develop - main - tags-ignore: - - "**" + - develop paths-ignore: - - "**/CHANGELOG.md" + - '**/CHANGELOG.md' pull_request: workflow_dispatch: +concurrency: + group: ${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }} + cancel-in-progress: true + jobs: - build-publish: + test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: - token: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} - fetch-depth: 0 persist-credentials: false - name: Install redis run: sudo apt-get install -y redis-server + - name: Cache cargo + uses: actions/cache@v3 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + - name: Cargo test run: | rustup update RUST_BACKTRACE=1 cargo test --all --features redis_tests -- --test-threads=1 + build-publish: + runs-on: ubuntu-latest + needs: test + outputs: + docker_image_digest: ${{ steps.docker_push.outputs.digest }} + new_release_published: ${{ steps.semantic.outputs.new_release_published }} + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Semantic Release - uses: cycjimmy/semantic-release-action@v3 + uses: cycjimmy/semantic-release-action@v4 id: semantic # Only run on non-PR events or only PRs that aren't from forks if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository env: - GITHUB_TOKEN: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SEMANTIC_RELEASE_PACKAGE: ${{ github.event.repository.name }} with: semantic_version: 19 @@ -45,15 +67,21 @@ jobs: @semantic-release/git@10.0.1 conventional-changelog-conventionalcommits@6.1.0 + - name: Checkout tag + if: steps.semantic.outputs.new_release_version != '' + uses: actions/checkout@v4 + with: + persist-credentials: false + ref: v${{ steps.semantic.outputs.new_release_version }} + - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v3 - name: Docker Meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | - blockstack/${{ github.event.repository.name }} hirosystems/${{ github.event.repository.name }} tags: | type=ref,event=branch @@ -62,18 +90,134 @@ jobs: type=semver,pattern={{major}}.{{minor}},value=${{ steps.semantic.outputs.new_release_version }},enable=${{ steps.semantic.outputs.new_release_version != '' }} type=raw,value=latest,enable={{is_default_branch}} - - name: Login to DockerHub - uses: docker/login-action@v2 + - name: Log in to DockerHub + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - - name: Build/Tag/Push Image - uses: docker/build-push-action@v2 + - name: Build/Push Image + uses: docker/build-push-action@v5 + id: docker_push with: context: . tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} file: ./dockerfiles/components/chainhook-node.dockerfile + cache-from: type=gha + cache-to: type=gha,mode=max # Only push if (there's a new release on main branch, or if building a non-main branch) and (Only run on non-PR events or only PRs that aren't from forks) - push: ${{ (github.ref != 'refs/heads/master' || steps.semantic.outputs.new_release_version != '') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + push: ${{ (github.ref != 'refs/heads/main' || steps.semantic.outputs.new_release_version != '') && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) }} + + deploy-dev: + runs-on: ubuntu-latest + strategy: + matrix: + k8s-env: [mainnet,testnet] + needs: build-publish + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + env: + DEPLOY_ENV: dev + environment: + name: Development-${{ matrix.k8s-env }} + url: https://platform.dev.hiro.so/ + steps: + - name: Checkout actions repo + uses: actions/checkout@v4 + with: + ref: main + token: ${{ secrets.GH_TOKEN }} + repository: ${{ secrets.DEVOPS_ACTIONS_REPO }} + + - name: Deploy Chainhook build to Dev ${{ matrix.k8s-env }} + uses: ./actions/deploy + with: + docker_tag: ${{ needs.build-publish.outputs.docker_image_digest }} + file_pattern: manifests/chainhooks/${{ matrix.k8s-env }}/chainhook-node/${{ env.DEPLOY_ENV }}/base/kustomization.yaml + gh_token: ${{ secrets.GH_TOKEN }} + + auto-approve-dev: + runs-on: ubuntu-latest + if: needs.build-publish.outputs.new_release_published == 'true' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) + needs: build-publish + steps: + - name: Approve pending deployments + run: | + sleep 5 + ENV_IDS=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/hirosystems/chainhook/actions/runs/${{ github.run_id }}/pending_deployments" | jq -r '[.[].environment.id // empty]') + if [[ "${ENV_IDS}" != "[]" ]]; then + curl -s -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/hirosystems/chainhook/actions/runs/${{ github.run_id }}/pending_deployments" -d "{\"environment_ids\":${ENV_IDS},\"state\":\"approved\",\"comment\":\"auto approve\"}" + fi + + deploy-staging: + runs-on: ubuntu-latest + strategy: + matrix: + k8s-env: [mainnet,testnet] + needs: + - build-publish + - deploy-dev + if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository + env: + DEPLOY_ENV: stg + environment: + name: Staging-${{ matrix.k8s-env }} + url: https://platform.stg.hiro.so/ + steps: + - name: Checkout actions repo + uses: actions/checkout@v4 + with: + ref: main + token: ${{ secrets.GH_TOKEN }} + repository: ${{ secrets.DEVOPS_ACTIONS_REPO }} + + - name: Deploy Chainhook build to Stg ${{ matrix.k8s-env }} + uses: ./actions/deploy + with: + docker_tag: ${{ needs.build-publish.outputs.docker_image_digest }} + file_pattern: manifests/chainhooks/${{ matrix.k8s-env }}/chainhook-node/${{ env.DEPLOY_ENV }}/base/kustomization.yaml + gh_token: ${{ secrets.GH_TOKEN }} + + auto-approve-stg: + runs-on: ubuntu-latest + if: needs.build-publish.outputs.new_release_published == 'true' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) + needs: + - build-publish + - deploy-dev + steps: + - name: Approve pending deployments + run: | + sleep 5 + ENV_IDS=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/hirosystems/chainhook/actions/runs/${{ github.run_id }}/pending_deployments" | jq -r '[.[].environment.id // empty]') + if [[ "${ENV_IDS}" != "[]" ]]; then + curl -s -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/hirosystems/chainhook/actions/runs/${{ github.run_id }}/pending_deployments" -d "{\"environment_ids\":${ENV_IDS},\"state\":\"approved\",\"comment\":\"auto approve\"}" + fi + + deploy-prod: + runs-on: ubuntu-latest + strategy: + matrix: + k8s-env: [mainnet,testnet] + needs: + - build-publish + - deploy-staging + if: needs.build-publish.outputs.new_release_published == 'true' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) + env: + DEPLOY_ENV: prd + environment: + name: Production-${{ matrix.k8s-env }} + url: https://platform.hiro.so/ + steps: + - name: Checkout actions repo + uses: actions/checkout@v4 + with: + ref: main + token: ${{ secrets.GH_TOKEN }} + repository: ${{ secrets.DEVOPS_ACTIONS_REPO }} + + - name: Deploy Chainhook build to Prd ${{ matrix.k8s-env }} + uses: ./actions/deploy + with: + docker_tag: ${{ needs.build-publish.outputs.docker_image_digest }} + file_pattern: manifests/chainhooks/${{ matrix.k8s-env }}/chainhook-node/${{ env.DEPLOY_ENV }}/base/kustomization.yaml + gh_token: ${{ secrets.GH_TOKEN }} From 947b11ee989b92fcaab8a4d1d39e83c62a674bd7 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 9 Oct 2023 13:37:57 -0400 Subject: [PATCH 72/99] fix: make `include_contract_abi` optional (#432) ### Description The new field `include_contract_abi` already was optional for the user-facing type `StacksChainhookNetworkSpecification`, but was not optional for the internal type `StacksChainhookSpecification`. Any time we converted to a `StacksChainhookSpecification`, we'd `.unwrap_or(false)`, which seemed okay. However, a running Chainhook node has the `StacksChainhookSpecification` type saved in redis, so whenever a pre-existing node is restarted after upgrading, it is missing the required `include_contract_abi` field and errors. This PR makes the field optional everywhere. I'll need to think about how to add tests to prevent this sort of bug in the future. ### Checklist - [x] All tests pass - [ ] Tests added in this PR (if applicable) --- .../chainhook-sdk/src/chainhooks/stacks/mod.rs | 2 +- .../chainhook-sdk/src/chainhooks/tests/mod.rs | 16 ++++++++-------- components/chainhook-sdk/src/chainhooks/types.rs | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 6f0cd47c5..345c80369 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -795,7 +795,7 @@ pub fn serialize_stacks_payload_to_json<'a>( ctx: &Context, ) -> JsonValue { let decode_clarity_values = trigger.should_decode_clarity_value(); - let include_contract_abi = trigger.chainhook.include_contract_abi; + let include_contract_abi = trigger.chainhook.include_contract_abi.unwrap_or(false); json!({ "apply": trigger.apply.into_iter().map(|(transactions, block)| { serialize_stacks_block(block, transactions, decode_clarity_values, include_contract_abi, ctx) diff --git a/components/chainhook-sdk/src/chainhooks/tests/mod.rs b/components/chainhook-sdk/src/chainhooks/tests/mod.rs index 6fb06e65a..cf564b067 100644 --- a/components/chainhook-sdk/src/chainhooks/tests/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/tests/mod.rs @@ -348,7 +348,7 @@ fn test_stacks_predicates( expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: false, + include_contract_abi: None, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -428,7 +428,7 @@ fn test_stacks_predicate_contract_deploy(predicate: StacksPredicate, expected_ap expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: false, + include_contract_abi: None, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -483,7 +483,7 @@ fn verify_optional_addition_of_contract_abi() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: true, + include_contract_abi: Some(true), predicate: StacksPredicate::ContractDeployment( StacksContractDeploymentPredicate::Deployer("*".to_string()), ), @@ -503,7 +503,7 @@ fn verify_optional_addition_of_contract_abi() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: true, + include_contract_abi: Some(true), predicate: StacksPredicate::ContractCall(StacksContractCallBasedPredicate { contract_identifier: "ST13F481SBR0R7Z6NMMH8YV2FJJYXA5JPA0AD3HP9.subnet-v1".to_string(), method: "commit-block".to_string(), @@ -537,7 +537,7 @@ fn verify_optional_addition_of_contract_abi() { } } } - contract_deploy_chainhook.include_contract_abi = false; + contract_deploy_chainhook.include_contract_abi = Some(false); let predicates = vec![&contract_deploy_chainhook, &contract_call_chainhook]; let (triggered, _blocks, _) = evaluate_stacks_chainhooks_on_chain_event(&event, predicates, &Context::empty()); @@ -622,7 +622,7 @@ fn test_stacks_predicate_contract_call(predicate: StacksPredicate, expected_appl expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: false, + include_contract_abi: None, predicate: predicate, action: HookAction::Noop, enabled: true, @@ -657,7 +657,7 @@ fn test_stacks_hook_action_noop() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: None, - include_contract_abi: false, + include_contract_abi: None, predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), )), @@ -715,7 +715,7 @@ fn test_stacks_hook_action_file_append() { expire_after_occurrence: None, capture_all_events: None, decode_clarity_values: Some(true), - include_contract_abi: false, + include_contract_abi: None, predicate: StacksPredicate::Txid(ExactMatchingRule::Equals( "0xb92c2ade84a8b85f4c72170680ae42e65438aea4db72ba4b2d6a6960f4141ce8".to_string(), )), diff --git a/components/chainhook-sdk/src/chainhooks/types.rs b/components/chainhook-sdk/src/chainhooks/types.rs index 3041c6457..c26566d98 100644 --- a/components/chainhook-sdk/src/chainhooks/types.rs +++ b/components/chainhook-sdk/src/chainhooks/types.rs @@ -363,7 +363,7 @@ impl StacksChainhookFullSpecification { capture_all_events: spec.capture_all_events, decode_clarity_values: spec.decode_clarity_values, expire_after_occurrence: spec.expire_after_occurrence, - include_contract_abi: spec.include_contract_abi.unwrap_or(false), + include_contract_abi: spec.include_contract_abi, predicate: spec.predicate, action: spec.action, enabled: false, @@ -688,7 +688,7 @@ pub struct StacksChainhookSpecification { pub capture_all_events: Option, #[serde(skip_serializing_if = "Option::is_none")] pub decode_clarity_values: Option, - pub include_contract_abi: bool, + pub include_contract_abi: Option, #[serde(rename = "predicate")] pub predicate: StacksPredicate, pub action: HookAction, From b66a0ac3006e63471c4799357929ed11f3f3d549 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Mon, 9 Oct 2023 16:59:29 -0400 Subject: [PATCH 73/99] fix: warn instead of panic on setting status (#435) --- components/chainhook-cli/src/service/mod.rs | 24 +++++++++++---------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index 8752e51af..3a8748fd8 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -713,7 +713,8 @@ fn set_predicate_streaming_status( PredicateStatus::New | PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { - unreachable!("unreachable predicate status: {:?}", status) + warn!(ctx.expect_logger(), "Attempting to set Streaming status when previous status was {:?} for predicate {}", status, predicate_key); + return; } }, None => (None, 0, 0, 0), @@ -812,8 +813,9 @@ pub fn set_predicate_scanning_status( None } } - PredicateStatus::Interrupted(_) | PredicateStatus::ConfirmedExpiration(_) => { - unreachable!("unreachable predicate status: {:?}", status) + PredicateStatus::ConfirmedExpiration(_) | PredicateStatus::Interrupted(_) => { + warn!(ctx.expect_logger(), "Attempting to set Scanning status when previous status was {:?} for predicate {}", status, predicate_key); + return; } }, None => None, @@ -891,11 +893,8 @@ pub fn set_unconfirmed_expiration_status( expired_at_block_height, ) } - PredicateStatus::Interrupted(_) => { - unreachable!("unreachable predicate status: {:?}", status) - } - PredicateStatus::ConfirmedExpiration(_) => { - warn!(ctx.expect_logger(), "Attempting to set UnconfirmedExpiration status when ConfirmedExpiration status has already been set for predicate {}", predicate_key); + PredicateStatus::ConfirmedExpiration(_) | PredicateStatus::Interrupted(_) => { + warn!(ctx.expect_logger(), "Attempting to set UnconfirmedExpiration status when previous status was {:?} for predicate {}", status, predicate_key); return; } }, @@ -934,11 +933,14 @@ pub fn set_confirmed_expiration_status( let expired_data = match current_status { Some(status) => match status { PredicateStatus::UnconfirmedExpiration(expired_data) => expired_data, - PredicateStatus::ConfirmedExpiration(_) => { - warn!(ctx.expect_logger(), "Attempting to set ConfirmedExpiration status when ConfirmedExpiration status has already been set for predicate {}", predicate_key); + PredicateStatus::ConfirmedExpiration(_) + | PredicateStatus::Interrupted(_) + | PredicateStatus::New + | PredicateStatus::Scanning(_) + | PredicateStatus::Streaming(_) => { + warn!(ctx.expect_logger(), "Attempting to set ConfirmedExpiration status when previous status was {:?} for predicate {}", status, predicate_key); return; } - _ => unreachable!("unreachable predicate status: {:?}", status), }, None => unreachable!("found no status for predicate: {}", predicate_key), }; From 68daa17dfe4f671ed0a3a908ebd2169d14c05c81 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Tue, 10 Oct 2023 14:05:44 -0400 Subject: [PATCH 74/99] fix: don't register confirmed/interrupted predicates on startup (#436) --- components/chainhook-cli/src/service/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index 3a8748fd8..aaf204679 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -78,7 +78,11 @@ impl Service { }; leftover_scans.push((predicate.clone(), Some(scanning_data))); } - _ => {} + PredicateStatus::UnconfirmedExpiration(_) => {} + PredicateStatus::ConfirmedExpiration(_) | PredicateStatus::Interrupted(_) => { + // Confirmed and Interrupted predicates don't need to be reregistered. + continue; + } } match chainhook_config.register_specification(predicate) { Ok(_) => { From 09b68ca4df2c46e8c43a1a71e270d7c54da100e9 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 10 Oct 2023 19:31:15 +0000 Subject: [PATCH 75/99] chore(release): 1.1.0 [skip ci] ## [1.1.0](https://github.com/hirosystems/chainhook/compare/v1.0.0...v1.1.0) (2023-10-10) ### Features * allow matching with regex for stacks print_event ([#380](https://github.com/hirosystems/chainhook/issues/380)) ([131809e](https://github.com/hirosystems/chainhook/commit/131809e7d2b8e4b48b83114440a4876ec9aee9ee)), closes [#348](https://github.com/hirosystems/chainhook/issues/348) * augment predicate status returned by GET/LIST endpoints ([#397](https://github.com/hirosystems/chainhook/issues/397)) ([a100263](https://github.com/hirosystems/chainhook/commit/a100263a0bcab3a43c9bbce49ddead754d2d621c)), closes [#396](https://github.com/hirosystems/chainhook/issues/396) [#324](https://github.com/hirosystems/chainhook/issues/324) [#390](https://github.com/hirosystems/chainhook/issues/390) [#402](https://github.com/hirosystems/chainhook/issues/402) [#403](https://github.com/hirosystems/chainhook/issues/403) * introduce "data_handler_tx" ([ee486f3](https://github.com/hirosystems/chainhook/commit/ee486f3571f97728d5305bdb72a303134fca1bf5)) ### Bug Fixes * build error ([85d4d91](https://github.com/hirosystems/chainhook/commit/85d4d91ca6276a25d0bc95e256da356758155466)) * build errors ([b9ff1aa](https://github.com/hirosystems/chainhook/commit/b9ff1aab26a26b9ada1e19d12a891fa2e8ad72fd)) * build errro ([be0c229](https://github.com/hirosystems/chainhook/commit/be0c22957b7345721e33d38e3bfa98794155e7a7)) * bump retries and delays ([aff3690](https://github.com/hirosystems/chainhook/commit/aff36904e557026ab91a039e40959957b5bbc309)) * chainhook not being registered ([5a809c6](https://github.com/hirosystems/chainhook/commit/5a809c63bec1c949314ecbd44ef1348286968dec)) * ensure that the parent block was previously received. else, fetch it ([2755266](https://github.com/hirosystems/chainhook/commit/275526620209e8b7137722f9c081aa7b9dca31e5)) * migrate to finer zmq lib ([4eb5a07](https://github.com/hirosystems/chainhook/commit/4eb5a07ad350360f159b5443d0b2d665c20892bf)) * prevent panic when scanning from genesis block ([#408](https://github.com/hirosystems/chainhook/issues/408)) ([1868a06](https://github.com/hirosystems/chainhook/commit/1868a06aba6de61bfb516b0f88b3e900a5d99a64)) * remove event_handlers ([6fecfd2](https://github.com/hirosystems/chainhook/commit/6fecfd2f41fe5bc8c672a51bcf3050c634927b84)) * retrieve blocks until tip ([5213f5f](https://github.com/hirosystems/chainhook/commit/5213f5f67a8adfddc72de7c707eb9d0de46150a2)) * revisit approach ([67a34dc](https://github.com/hirosystems/chainhook/commit/67a34dcb2f7dab546bb88bd1a6ed098109953531)) * use crossbeam channels ([ea33553](https://github.com/hirosystems/chainhook/commit/ea335530c174b8893013e6be7e0258285c4a9667)) * workflow ([d434c93](https://github.com/hirosystems/chainhook/commit/d434c9362ec46b13f1a98d51f62d1c1938f70319)) --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b3fd86ad..3a7c3c501 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +## [1.1.0](https://github.com/hirosystems/chainhook/compare/v1.0.0...v1.1.0) (2023-10-10) + + +### Features + +* allow matching with regex for stacks print_event ([#380](https://github.com/hirosystems/chainhook/issues/380)) ([131809e](https://github.com/hirosystems/chainhook/commit/131809e7d2b8e4b48b83114440a4876ec9aee9ee)), closes [#348](https://github.com/hirosystems/chainhook/issues/348) +* augment predicate status returned by GET/LIST endpoints ([#397](https://github.com/hirosystems/chainhook/issues/397)) ([a100263](https://github.com/hirosystems/chainhook/commit/a100263a0bcab3a43c9bbce49ddead754d2d621c)), closes [#396](https://github.com/hirosystems/chainhook/issues/396) [#324](https://github.com/hirosystems/chainhook/issues/324) [#390](https://github.com/hirosystems/chainhook/issues/390) [#402](https://github.com/hirosystems/chainhook/issues/402) [#403](https://github.com/hirosystems/chainhook/issues/403) +* introduce "data_handler_tx" ([ee486f3](https://github.com/hirosystems/chainhook/commit/ee486f3571f97728d5305bdb72a303134fca1bf5)) + + +### Bug Fixes + +* build error ([85d4d91](https://github.com/hirosystems/chainhook/commit/85d4d91ca6276a25d0bc95e256da356758155466)) +* build errors ([b9ff1aa](https://github.com/hirosystems/chainhook/commit/b9ff1aab26a26b9ada1e19d12a891fa2e8ad72fd)) +* build errro ([be0c229](https://github.com/hirosystems/chainhook/commit/be0c22957b7345721e33d38e3bfa98794155e7a7)) +* bump retries and delays ([aff3690](https://github.com/hirosystems/chainhook/commit/aff36904e557026ab91a039e40959957b5bbc309)) +* chainhook not being registered ([5a809c6](https://github.com/hirosystems/chainhook/commit/5a809c63bec1c949314ecbd44ef1348286968dec)) +* ensure that the parent block was previously received. else, fetch it ([2755266](https://github.com/hirosystems/chainhook/commit/275526620209e8b7137722f9c081aa7b9dca31e5)) +* migrate to finer zmq lib ([4eb5a07](https://github.com/hirosystems/chainhook/commit/4eb5a07ad350360f159b5443d0b2d665c20892bf)) +* prevent panic when scanning from genesis block ([#408](https://github.com/hirosystems/chainhook/issues/408)) ([1868a06](https://github.com/hirosystems/chainhook/commit/1868a06aba6de61bfb516b0f88b3e900a5d99a64)) +* remove event_handlers ([6fecfd2](https://github.com/hirosystems/chainhook/commit/6fecfd2f41fe5bc8c672a51bcf3050c634927b84)) +* retrieve blocks until tip ([5213f5f](https://github.com/hirosystems/chainhook/commit/5213f5f67a8adfddc72de7c707eb9d0de46150a2)) +* revisit approach ([67a34dc](https://github.com/hirosystems/chainhook/commit/67a34dcb2f7dab546bb88bd1a6ed098109953531)) +* use crossbeam channels ([ea33553](https://github.com/hirosystems/chainhook/commit/ea335530c174b8893013e6be7e0258285c4a9667)) +* workflow ([d434c93](https://github.com/hirosystems/chainhook/commit/d434c9362ec46b13f1a98d51f62d1c1938f70319)) + #### 1.4.0 (2023-01-23) ##### New Features From 80737addce9d6df7035b5586da11f33640ee72d2 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 10:37:16 -0400 Subject: [PATCH 76/99] fix: redis conn (#442) This PR is fixing the management of the redis connection. In the current approach, we're reusing an existing connection that is being opened at startup for test purposes, but that can get broken after some time if blocks take time to arrive. Fix: we open/close a new connection every time a new block hits the API. --- components/chainhook-cli/src/service/mod.rs | 179 +++++++++--------- .../chainhook-sdk/src/indexer/stacks/mod.rs | 2 +- 2 files changed, 92 insertions(+), 89 deletions(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index aaf204679..48d509d5c 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -225,11 +225,12 @@ impl Service { let mut stacks_event = 0; let ctx = self.ctx.clone(); - let mut predicates_db_conn = match self.config.http_api { + match self.config.http_api { PredicatesApi::On(ref api_config) => { - Some(open_readwrite_predicates_db_conn_or_panic(api_config, &ctx)) + // Test redis connection + open_readwrite_predicates_db_conn(api_config)?; } - PredicatesApi::Off => None, + PredicatesApi::Off => {} }; for predicate_with_last_scanned_block in leftover_scans { @@ -265,17 +266,8 @@ impl Service { // If no start block specified, depending on the nature the hook, we'd like to retrieve: // - contract-id if let PredicatesApi::On(ref config) = self.config.http_api { - let mut predicates_db_conn = match open_readwrite_predicates_db_conn(config) - { - Ok(con) => con, - Err(e) => { - error!( - self.ctx.expect_logger(), - "unable to register predicate: {}", - e.to_string() - ); - continue; - } + let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + continue; }; update_predicate_spec( &spec.key(), @@ -301,17 +293,8 @@ impl Service { } ObserverEvent::PredicateEnabled(spec) => { if let PredicatesApi::On(ref config) = self.config.http_api { - let mut predicates_db_conn = match open_readwrite_predicates_db_conn(config) - { - Ok(con) => con, - Err(e) => { - error!( - self.ctx.expect_logger(), - "unable to enable predicate: {}", - e.to_string() - ); - continue; - } + let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + continue; }; update_predicate_spec( &spec.key(), @@ -329,17 +312,8 @@ impl Service { } ObserverEvent::PredicateDeregistered(spec) => { if let PredicatesApi::On(ref config) = self.config.http_api { - let mut predicates_db_conn = match open_readwrite_predicates_db_conn(config) - { - Ok(con) => con, - Err(e) => { - error!( - self.ctx.expect_logger(), - "unable to deregister predicate: {}", - e.to_string() - ); - continue; - } + let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + continue; }; let predicate_key = spec.key(); let res: Result<(), redis::RedisError> = @@ -355,14 +329,20 @@ impl Service { } ObserverEvent::BitcoinChainEvent((chain_update, report)) => { debug!(self.ctx.expect_logger(), "Bitcoin update not stored"); - match chain_update { - chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithBlocks(data) => { - if let Some(ref mut predicates_db_conn) = predicates_db_conn { + if let PredicatesApi::On(ref config) = self.config.http_api { + let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + continue; + }; + + match chain_update { + chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithBlocks( + data, + ) => { for confirmed_block in &data.confirmed_blocks { match expire_predicates_for_block( &Chain::Bitcoin, confirmed_block.block_identifier.index, - predicates_db_conn, + &mut predicates_db_conn, &ctx, ) { Some(expired_predicate_uuids) => { @@ -383,14 +363,14 @@ impl Service { } } } - } - chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithReorg(data) => { - if let Some(ref mut predicates_db_conn) = predicates_db_conn { + chainhook_sdk::types::BitcoinChainEvent::ChainUpdatedWithReorg( + data, + ) => { for confirmed_block in &data.confirmed_blocks { match expire_predicates_for_block( &Chain::Bitcoin, confirmed_block.block_identifier.index, - predicates_db_conn, + &mut predicates_db_conn, &ctx, ) { Some(expired_predicate_uuids) => { @@ -412,9 +392,12 @@ impl Service { } } } - } - if let Some(ref mut predicates_db_conn) = predicates_db_conn { - update_stats_from_report(Chain::Bitcoin, report, predicates_db_conn, &ctx); + update_stats_from_report( + Chain::Bitcoin, + report, + &mut predicates_db_conn, + &ctx, + ); } } ObserverEvent::StacksChainEvent((chain_event, report)) => { @@ -432,15 +415,49 @@ impl Service { continue; } }; + match &chain_event { StacksChainEvent::ChainUpdatedWithBlocks(data) => { - stacks_event += 1; - if let Some(ref mut predicates_db_conn) = predicates_db_conn { + confirm_entries_in_stacks_blocks( + &data.confirmed_blocks, + &stacks_db_conn_rw, + &self.ctx, + ); + draft_entries_in_stacks_blocks( + &data.new_blocks, + &stacks_db_conn_rw, + &self.ctx, + ) + } + StacksChainEvent::ChainUpdatedWithReorg(data) => { + confirm_entries_in_stacks_blocks( + &data.confirmed_blocks, + &stacks_db_conn_rw, + &self.ctx, + ); + draft_entries_in_stacks_blocks( + &data.blocks_to_apply, + &stacks_db_conn_rw, + &self.ctx, + ) + } + StacksChainEvent::ChainUpdatedWithMicroblocks(_) + | StacksChainEvent::ChainUpdatedWithMicroblocksReorg(_) => {} + }; + + if let PredicatesApi::On(ref config) = self.config.http_api { + let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + continue; + }; + + match &chain_event { + StacksChainEvent::ChainUpdatedWithBlocks(data) => { + stacks_event += 1; for confirmed_block in &data.confirmed_blocks { match expire_predicates_for_block( &Chain::Stacks, confirmed_block.block_identifier.index, - predicates_db_conn, + &mut predicates_db_conn, &ctx, ) { Some(expired_predicate_uuids) => { @@ -461,24 +478,12 @@ impl Service { } } } - confirm_entries_in_stacks_blocks( - &data.confirmed_blocks, - &stacks_db_conn_rw, - &self.ctx, - ); - draft_entries_in_stacks_blocks( - &data.new_blocks, - &stacks_db_conn_rw, - &self.ctx, - ) - } - StacksChainEvent::ChainUpdatedWithReorg(data) => { - if let Some(ref mut predicates_db_conn) = predicates_db_conn { + StacksChainEvent::ChainUpdatedWithReorg(data) => { for confirmed_block in &data.confirmed_blocks { match expire_predicates_for_block( &Chain::Stacks, confirmed_block.block_identifier.index, - predicates_db_conn, + &mut predicates_db_conn, &ctx, ) { Some(expired_predicate_uuids) => { @@ -499,23 +504,17 @@ impl Service { } } } - confirm_entries_in_stacks_blocks( - &data.confirmed_blocks, - &stacks_db_conn_rw, - &self.ctx, - ); - draft_entries_in_stacks_blocks( - &data.blocks_to_apply, - &stacks_db_conn_rw, - &self.ctx, - ) - } - StacksChainEvent::ChainUpdatedWithMicroblocks(_) - | StacksChainEvent::ChainUpdatedWithMicroblocksReorg(_) => {} + StacksChainEvent::ChainUpdatedWithMicroblocks(_) + | StacksChainEvent::ChainUpdatedWithMicroblocksReorg(_) => {} + }; + update_stats_from_report( + Chain::Stacks, + report, + &mut predicates_db_conn, + &ctx, + ); }; - if let Some(ref mut predicates_db_conn) = predicates_db_conn { - update_stats_from_report(Chain::Stacks, report, predicates_db_conn, &ctx); - } + // Every 32 blocks, we will check if there's a new Stacks file archive to ingest if stacks_event > 32 { stacks_event = 0; @@ -1103,18 +1102,22 @@ pub fn open_readwrite_predicates_db_conn( .map_err(|e| format!("unable to connect to db: {}", e.to_string())) } +pub fn open_readwrite_predicates_db_conn_verbose( + config: &PredicatesApiConfig, + ctx: &Context, +) -> Result { + let res = open_readwrite_predicates_db_conn(config); + if let Err(ref e) = res { + error!(ctx.expect_logger(), "{}", e.to_string()); + } + res +} + pub fn open_readwrite_predicates_db_conn_or_panic( config: &PredicatesApiConfig, ctx: &Context, ) -> Connection { - let redis_con = match open_readwrite_predicates_db_conn(config) { - Ok(con) => con, - Err(message) => { - error!(ctx.expect_logger(), "Redis: {}", message.to_string()); - panic!(); - } - }; - redis_con + open_readwrite_predicates_db_conn_verbose(config, ctx).expect("unable to open redis conn") } #[cfg(test)] diff --git a/components/chainhook-sdk/src/indexer/stacks/mod.rs b/components/chainhook-sdk/src/indexer/stacks/mod.rs index 49025e621..5d7e3a060 100644 --- a/components/chainhook-sdk/src/indexer/stacks/mod.rs +++ b/components/chainhook-sdk/src/indexer/stacks/mod.rs @@ -342,7 +342,7 @@ pub fn standardize_stacks_block( index: match block.block_height { 0 => 0, _ => block.block_height - 1, - } + }, }, timestamp: block.parent_burn_block_timestamp, metadata: StacksBlockMetadata { From 8c4e5ea8b54b6b20d3b19796c9d0b57f3d38a3a2 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 11 Oct 2023 14:54:14 -0400 Subject: [PATCH 77/99] fix: add auth header for stacks hook (#444) Fixes #438 --- components/chainhook-sdk/src/chainhooks/stacks/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 345c80369..9e8c1a81d 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -829,6 +829,7 @@ pub fn handle_stacks_hook_action<'a>( client .request(method, &host) .header("Content-Type", "application/json") + .header("Authorization", http.authorization_header.clone()) .body(body), )) } From 0e84fe7e2b6098345eee4b997138e6910a849996 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 11 Oct 2023 15:52:53 -0400 Subject: [PATCH 78/99] fix: don't evaluate transactions for block predicates (#445) --- components/chainhook-sdk/src/chainhooks/stacks/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs index 9e8c1a81d..5e5afb300 100644 --- a/components/chainhook-sdk/src/chainhooks/stacks/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/stacks/mod.rs @@ -272,11 +272,11 @@ pub fn evaluate_stacks_chainhook_on_blocks<'a>( for block in blocks { if end_block >= block.get_identifier().index { let mut hits = vec![]; - if chainhook.is_predicate_targeting_block_header() - && evaluate_stacks_predicate_on_block(block, chainhook, ctx) - { - for tx in block.get_transactions().iter() { - hits.push(tx); + if chainhook.is_predicate_targeting_block_header() { + if evaluate_stacks_predicate_on_block(block, chainhook, ctx) { + for tx in block.get_transactions().iter() { + hits.push(tx); + } } } else { for tx in block.get_transactions().iter() { From 612ebf165ceed0f6921e49319f3384a122473298 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Wed, 11 Oct 2023 16:46:53 -0400 Subject: [PATCH 79/99] chore: update cargo.toml versions (#443) --- Cargo.lock | 8 ++++---- components/chainhook-cli/Cargo.toml | 4 ++-- components/chainhook-sdk/Cargo.toml | 4 ++-- components/chainhook-types-rs/Cargo.toml | 2 +- docs/chainhook-openapi.json | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 764fe81b8..fd6c51f44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -398,7 +398,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chainhook" -version = "1.0.0" +version = "1.1.1" dependencies = [ "ansi_term", "atty", @@ -439,13 +439,13 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.9.0" +version = "0.10.0" dependencies = [ "base58 0.2.0", "base64", "bitcoincore-rpc", "bitcoincore-rpc-json", - "chainhook-types 1.0.12", + "chainhook-types 1.1.0", "clarinet-utils", "crossbeam-channel", "dashmap", @@ -487,7 +487,7 @@ dependencies = [ [[package]] name = "chainhook-types" -version = "1.0.12" +version = "1.1.0" dependencies = [ "hex", "schemars 0.8.12", diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 0179c2da0..9e725af19 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook" -version = "1.0.0" +version = "1.1.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -15,7 +15,7 @@ redis = "0.21.5" serde-redis = "0.12.0" hex = "0.4.3" rand = "0.8.5" -chainhook-sdk = { version = "0.9.0", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } +chainhook-sdk = { version = "0.10.0", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" hiro-system-kit = "0.1.0" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 96dd054ed..3accef78c 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.9.0" +version = "0.10.0" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" @@ -18,7 +18,7 @@ hiro-system-kit = "0.1.0" # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } -chainhook-types = { version = "1.0.12", path = "../chainhook-types-rs" } +chainhook-types = { version = "1.1.0", path = "../chainhook-types-rs" } rocket = { version = "=0.5.0-rc.3", features = ["json"] } bitcoincore-rpc = "0.16.0" bitcoincore-rpc-json = "0.16.0" diff --git a/components/chainhook-types-rs/Cargo.toml b/components/chainhook-types-rs/Cargo.toml index de2f3263f..e93c82138 100644 --- a/components/chainhook-types-rs/Cargo.toml +++ b/components/chainhook-types-rs/Cargo.toml @@ -2,7 +2,7 @@ name = "chainhook-types" description = "Bitcoin and Stacks data schemas, based on the Rosetta specification" license = "MIT" -version = "1.0.12" +version = "1.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/docs/chainhook-openapi.json b/docs/chainhook-openapi.json index f70b80179..0960d2686 100644 --- a/docs/chainhook-openapi.json +++ b/docs/chainhook-openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "chainhook", - "version": "1.0.0" + "version": "1.1.1" }, "paths": { "/ping": { From c0e4495ffb09da03e06cc3944abda5624ddead7d Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 11 Oct 2023 22:08:31 +0000 Subject: [PATCH 80/99] chore(release): 1.1.1 [skip ci] ## [1.1.1](https://github.com/hirosystems/chainhook/compare/v1.1.0...v1.1.1) (2023-10-11) ### Bug Fixes * add auth header for stacks hook ([#444](https://github.com/hirosystems/chainhook/issues/444)) ([8c4e5ea](https://github.com/hirosystems/chainhook/commit/8c4e5ea8b54b6b20d3b19796c9d0b57f3d38a3a2)), closes [#438](https://github.com/hirosystems/chainhook/issues/438) * don't evaluate transactions for block predicates ([#445](https://github.com/hirosystems/chainhook/issues/445)) ([0e84fe7](https://github.com/hirosystems/chainhook/commit/0e84fe7e2b6098345eee4b997138e6910a849996)) * redis conn ([#442](https://github.com/hirosystems/chainhook/issues/442)) ([80737ad](https://github.com/hirosystems/chainhook/commit/80737addce9d6df7035b5586da11f33640ee72d2)) --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a7c3c501..6c1849615 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [1.1.1](https://github.com/hirosystems/chainhook/compare/v1.1.0...v1.1.1) (2023-10-11) + + +### Bug Fixes + +* add auth header for stacks hook ([#444](https://github.com/hirosystems/chainhook/issues/444)) ([8c4e5ea](https://github.com/hirosystems/chainhook/commit/8c4e5ea8b54b6b20d3b19796c9d0b57f3d38a3a2)), closes [#438](https://github.com/hirosystems/chainhook/issues/438) +* don't evaluate transactions for block predicates ([#445](https://github.com/hirosystems/chainhook/issues/445)) ([0e84fe7](https://github.com/hirosystems/chainhook/commit/0e84fe7e2b6098345eee4b997138e6910a849996)) +* redis conn ([#442](https://github.com/hirosystems/chainhook/issues/442)) ([80737ad](https://github.com/hirosystems/chainhook/commit/80737addce9d6df7035b5586da11f33640ee72d2)) + ## [1.1.0](https://github.com/hirosystems/chainhook/compare/v1.0.0...v1.1.0) (2023-10-10) From d8d9979823070dcef37a3556c99bc34b1d48e27c Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Sun, 15 Oct 2023 13:49:08 -0400 Subject: [PATCH 81/99] fix(stacks-indexer): prevent subtract with overflow (#449) I was attempting to update Clarinet to the latest version of chainhook-sdk/types, and I ran into this issue when testing the devnet. The devnet mines 100 bitcoin blocks, and the default `pox_info.first_burnchain_block_height` is also 100, so devnet startup would always fail. --- components/chainhook-sdk/src/indexer/stacks/mod.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/chainhook-sdk/src/indexer/stacks/mod.rs b/components/chainhook-sdk/src/indexer/stacks/mod.rs index 5d7e3a060..60a65a9ea 100644 --- a/components/chainhook-sdk/src/indexer/stacks/mod.rs +++ b/components/chainhook-sdk/src/indexer/stacks/mod.rs @@ -253,8 +253,10 @@ pub fn standardize_stacks_block( let pox_cycle_length: u64 = (chain_ctx.pox_info.prepare_phase_block_length + chain_ctx.pox_info.reward_phase_block_length) .into(); - let current_len = - block.burn_block_height - (1 + chain_ctx.pox_info.first_burnchain_block_height); + let current_len = u64::saturating_sub( + block.burn_block_height, + 1 + chain_ctx.pox_info.first_burnchain_block_height, + ); let pox_cycle_id: u32 = (current_len / pox_cycle_length).try_into().unwrap_or(0); let mut events: HashMap<&String, Vec<&NewEvent>> = HashMap::new(); for event in block.events.iter() { From f1b89f7c9a05f1bc4cb59253ba63dadeca0e3b07 Mon Sep 17 00:00:00 2001 From: Micaiah Reid Date: Sun, 15 Oct 2023 16:28:47 -0400 Subject: [PATCH 82/99] fix: buffer decoding of archive file to reduce memory usage (#450) Fixes #401 Previously, memory usage peaked at 32 GB. Now, I didn't see it go above 8 MB --- components/chainhook-cli/src/archive/mod.rs | 23 +++++++++++++++---- .../chainhook-cli/src/service/http_api.rs | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/components/chainhook-cli/src/archive/mod.rs b/components/chainhook-cli/src/archive/mod.rs index 759e97071..6c7715e4a 100644 --- a/components/chainhook-cli/src/archive/mod.rs +++ b/components/chainhook-cli/src/archive/mod.rs @@ -46,13 +46,25 @@ pub async fn download_tsv_file(config: &Config) -> Result<(), String> { let decoder_thread = std::thread::spawn(move || { let input = ChannelRead::new(rx); let mut decoder = GzDecoder::new(input); - let mut content = Vec::new(); - let _ = decoder.read_to_end(&mut content); let mut file = fs::File::create(&destination_path).unwrap(); - if let Err(e) = file.write_all(&content[..]) { - println!("unable to write file: {}", e.to_string()); - std::process::exit(1); + let mut buffer = [0; 512_000]; + loop { + match decoder.read(&mut buffer) { + Ok(0) => break, + Ok(n) => { + if let Err(e) = file.write_all(&buffer[..n]) { + let err = format!("unable to update compressed archive: {}", e.to_string()); + return Err(err); + } + } + Err(e) => { + let err = format!("unable to write compressed archive: {}", e.to_string()); + return Err(err); + } + } } + let _ = file.flush(); + Ok(()) }); if res.status() == reqwest::StatusCode::OK { @@ -69,6 +81,7 @@ pub async fn download_tsv_file(config: &Config) -> Result<(), String> { tokio::task::spawn_blocking(|| decoder_thread.join()) .await .unwrap() + .unwrap() .unwrap(); Ok(()) diff --git a/components/chainhook-cli/src/service/http_api.rs b/components/chainhook-cli/src/service/http_api.rs index 55b583905..191a33a7c 100644 --- a/components/chainhook-cli/src/service/http_api.rs +++ b/components/chainhook-cli/src/service/http_api.rs @@ -348,7 +348,7 @@ pub fn load_predicates_from_redis( ctx: &Context, ) -> Result, String> { let redis_uri: &str = config.expected_api_database_uri(); - let client = redis::Client::open(redis_uri.clone()) + let client = redis::Client::open(redis_uri) .map_err(|e| format!("unable to connect to redis: {}", e.to_string()))?; let mut predicate_db_conn = client .get_connection() From 6e95f6dda031f90e56e2c0675360fbee558a5917 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:51:31 -0400 Subject: [PATCH 83/99] chore: cargo fmt --- components/chainhook-cli/src/service/mod.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/components/chainhook-cli/src/service/mod.rs b/components/chainhook-cli/src/service/mod.rs index 48d509d5c..8e387d02e 100644 --- a/components/chainhook-cli/src/service/mod.rs +++ b/components/chainhook-cli/src/service/mod.rs @@ -266,7 +266,9 @@ impl Service { // If no start block specified, depending on the nature the hook, we'd like to retrieve: // - contract-id if let PredicatesApi::On(ref config) = self.config.http_api { - let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + let Ok(mut predicates_db_conn) = + open_readwrite_predicates_db_conn_verbose(&config, &ctx) + else { continue; }; update_predicate_spec( @@ -293,7 +295,9 @@ impl Service { } ObserverEvent::PredicateEnabled(spec) => { if let PredicatesApi::On(ref config) = self.config.http_api { - let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + let Ok(mut predicates_db_conn) = + open_readwrite_predicates_db_conn_verbose(&config, &ctx) + else { continue; }; update_predicate_spec( @@ -312,7 +316,9 @@ impl Service { } ObserverEvent::PredicateDeregistered(spec) => { if let PredicatesApi::On(ref config) = self.config.http_api { - let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + let Ok(mut predicates_db_conn) = + open_readwrite_predicates_db_conn_verbose(&config, &ctx) + else { continue; }; let predicate_key = spec.key(); @@ -330,7 +336,9 @@ impl Service { ObserverEvent::BitcoinChainEvent((chain_update, report)) => { debug!(self.ctx.expect_logger(), "Bitcoin update not stored"); if let PredicatesApi::On(ref config) = self.config.http_api { - let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + let Ok(mut predicates_db_conn) = + open_readwrite_predicates_db_conn_verbose(&config, &ctx) + else { continue; }; @@ -446,7 +454,9 @@ impl Service { }; if let PredicatesApi::On(ref config) = self.config.http_api { - let Ok(mut predicates_db_conn) = open_readwrite_predicates_db_conn_verbose(&config, &ctx) else { + let Ok(mut predicates_db_conn) = + open_readwrite_predicates_db_conn_verbose(&config, &ctx) + else { continue; }; From 6d63b1f25de52c9ff9490e64ac6674cabc6efbf7 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:52:04 -0400 Subject: [PATCH 84/99] refactor: simplify model --- .../src/chainhooks/bitcoin/mod.rs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs index dd17c6b07..a81c66299 100644 --- a/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs @@ -26,25 +26,20 @@ pub struct BitcoinTriggerChainhook<'a> { pub rollback: Vec<(Vec<&'a BitcoinTransactionData>, &'a BitcoinBlockData)>, } -#[derive(Clone, Debug, Serialize)] -pub struct BitcoinApplyTransactionPayload { +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct BitcoinTransactionPayload { pub block: BitcoinBlockData, } -#[derive(Clone, Debug, Serialize)] -pub struct BitcoinRollbackTransactionPayload { - pub block: BitcoinBlockData, -} - -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct BitcoinChainhookPayload { pub uuid: String, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct BitcoinChainhookOccurrencePayload { - pub apply: Vec, - pub rollback: Vec, + pub apply: Vec, + pub rollback: Vec, pub chainhook: BitcoinChainhookPayload, } @@ -280,7 +275,7 @@ pub fn handle_bitcoin_hook_action<'a>( .into_iter() .map(|t| t.clone()) .collect::>(); - BitcoinApplyTransactionPayload { block } + BitcoinTransactionPayload { block } }) .collect::>(), rollback: trigger @@ -292,7 +287,7 @@ pub fn handle_bitcoin_hook_action<'a>( .into_iter() .map(|t| t.clone()) .collect::>(); - BitcoinRollbackTransactionPayload { block } + BitcoinTransactionPayload { block } }) .collect::>(), chainhook: BitcoinChainhookPayload { From b0bab5241440064091022ed7607c8575db686310 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:52:34 -0400 Subject: [PATCH 85/99] chore: retrieve required function --- .../chainhook-sdk/src/indexer/bitcoin/mod.rs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index f2f6b0884..f46d45527 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -229,6 +229,40 @@ pub async fn retrieve_block_hash( Ok(block_hash) } +pub async fn try_download_block_bytes_with_retry( + http_client: HttpClient, + block_height: u64, + bitcoin_config: BitcoinConfig, + ctx: Context, +) -> Result, String> { + let block_hash = + retrieve_block_hash_with_retry(&http_client, &block_height, &bitcoin_config, &ctx) + .await + .unwrap(); + + let mut errors_count = 0; + + let response = loop { + match download_block(&http_client, &block_hash, &bitcoin_config, &ctx).await { + Ok(result) => break result, + Err(_e) => { + errors_count += 1; + if errors_count > 1 { + ctx.try_log(|logger| { + slog::warn!( + logger, + "unable to fetch block #{block_hash}: will retry in a few seconds (attempt #{errors_count}).", + ) + }); + } + std::thread::sleep(std::time::Duration::from_millis(1500)); + continue; + } + } + }; + Ok(response) +} + pub async fn download_block( http_client: &HttpClient, block_hash: &str, From fe2987fe3c133c3871d667ebc956f9012192b299 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:52:47 -0400 Subject: [PATCH 86/99] chore: cargo fmt --- components/chainhook-sdk/src/observer/mod.rs | 14 ++++++++++---- components/chainhook-sdk/src/observer/zmq.rs | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 10516a2e6..298e3ee7e 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -809,12 +809,15 @@ pub async fn start_observer_commands_handler( for header in data.new_headers.iter() { if store_update_required { - let Some(block) = bitcoin_block_store.remove(&header.block_identifier) else { + let Some(block) = + bitcoin_block_store.remove(&header.block_identifier) + else { continue; }; blocks_to_mutate.push(block); } else { - let Some(cache) = bitcoin_block_store.get(&header.block_identifier) else { + let Some(cache) = bitcoin_block_store.get(&header.block_identifier) + else { continue; }; new_blocks.push(cache.block.clone()); @@ -866,12 +869,15 @@ pub async fn start_observer_commands_handler( for header in data.headers_to_apply.iter() { if store_update_required { - let Some(block) = bitcoin_block_store.remove(&header.block_identifier) else { + let Some(block) = + bitcoin_block_store.remove(&header.block_identifier) + else { continue; }; blocks_to_mutate.push(block); } else { - let Some(cache) = bitcoin_block_store.get(&header.block_identifier) else { + let Some(cache) = bitcoin_block_store.get(&header.block_identifier) + else { continue; }; blocks_to_apply.push(cache.block.clone()); diff --git a/components/chainhook-sdk/src/observer/zmq.rs b/components/chainhook-sdk/src/observer/zmq.rs index 0f53cc740..30a50592f 100644 --- a/components/chainhook-sdk/src/observer/zmq.rs +++ b/components/chainhook-sdk/src/observer/zmq.rs @@ -36,8 +36,8 @@ pub async fn start_zeromq_runloop( ctx: &Context, ) { let BitcoinBlockSignaling::ZeroMQ(ref bitcoind_zmq_url) = config.bitcoin_block_signaling else { - unreachable!() - }; + unreachable!() + }; let bitcoind_zmq_url = bitcoind_zmq_url.clone(); let bitcoin_config = config.get_bitcoin_config(); From 56ffcc32c1d01b948985097ee0f83c75cd49b94c Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:53:01 -0400 Subject: [PATCH 87/99] chore: update crates --- Cargo.lock | 28 +++++++++++++++++++++++----- components/chainhook-sdk/Cargo.toml | 4 ++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fd6c51f44..0db973bd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,7 +416,7 @@ dependencies = [ "flume", "futures-util", "hex", - "hiro-system-kit", + "hiro-system-kit 0.1.0", "num_cpus", "rand 0.8.5", "redis", @@ -452,7 +452,7 @@ dependencies = [ "futures", "fxhash", "hex", - "hiro-system-kit", + "hiro-system-kit 0.3.1", "hyper", "lazy_static", "rand 0.8.5", @@ -637,7 +637,7 @@ dependencies = [ "debug_types", "futures", "getrandom 0.2.8", - "hiro-system-kit", + "hiro-system-kit 0.1.0", "httparse", "integer-sqrt", "lazy_static", @@ -1641,6 +1641,24 @@ dependencies = [ "tokio", ] +[[package]] +name = "hiro-system-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a96596d2b33489f33f79b2df6f340dbbd2baba05a251715bb84661d33bf1c9" +dependencies = [ + "ansi_term", + "atty", + "lazy_static", + "slog", + "slog-async", + "slog-atomic", + "slog-json", + "slog-scope", + "slog-term", + "tokio", +] + [[package]] name = "hmac" version = "0.7.1" @@ -3856,9 +3874,9 @@ dependencies = [ [[package]] name = "stacks-rpc-client" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4903f6164688594cb80856abc27d7a76fa7b6ac84c6fc70a45e414d097c191ab" +checksum = "12eef9ff174e8345b414abbfa5ed7e271e772d1e6b2c3eaa9f7f02209c87f48e" dependencies = [ "clarity-repl", "hmac 0.12.1", diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 3accef78c..fde3fb142 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -12,9 +12,9 @@ serde = {version = "1", features = ["rc"]} serde_json = { version = "1", features = ["arbitrary_precision"] } serde-hex = "0.1.0" serde_derive = "1" -stacks-rpc-client = "=1.0.8" +stacks-rpc-client = "1.0.10" clarinet-utils = "1.0.0" -hiro-system-kit = "0.1.0" +hiro-system-kit = "0.3.1" # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } From f8bdef441925756929dff2af6be6577bedb08733 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Wed, 11 Oct 2023 20:53:41 -0400 Subject: [PATCH 88/99] chore: update chainhook-sdk version --- Cargo.lock | 2 +- components/chainhook-sdk/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0db973bd0..20755d72f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -439,7 +439,7 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.10.0" +version = "0.10.1" dependencies = [ "base58 0.2.0", "base64", diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index fde3fb142..dc87edd21 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.10.0" +version = "0.10.1" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" From 64f808c619a586cd87b77e949b9b733b324e442d Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Thu, 12 Oct 2023 10:45:35 -0400 Subject: [PATCH 89/99] chore: tweak dependencies --- Cargo.lock | 190 ---------------------------- components/chainhook-cli/Cargo.toml | 7 +- 2 files changed, 6 insertions(+), 191 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20755d72f..bc1ea2bf0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -739,16 +739,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -1347,21 +1337,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.1.0" @@ -1781,19 +1756,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "iana-time-zone" version = "0.1.53" @@ -2273,24 +2235,6 @@ dependencies = [ "getrandom 0.2.8", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nibble_vec" version = "0.1.0" @@ -2414,51 +2358,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "openssl" -version = "0.10.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.105", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" -dependencies = [ - "autocfg", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "os_str_bytes" version = "6.4.1" @@ -2970,12 +2869,10 @@ dependencies = [ "http-body", "hyper", "hyper-rustls", - "hyper-tls", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -2985,7 +2882,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "tokio", - "tokio-native-tls", "tokio-rustls", "tokio-util", "tower-service", @@ -3307,16 +3203,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "schannel" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" -dependencies = [ - "lazy_static", - "windows-sys 0.36.1", -] - [[package]] name = "schemars" version = "0.8.11" @@ -3413,29 +3299,6 @@ dependencies = [ "cc", ] -[[package]] -name = "security-framework" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "semver" version = "0.9.0" @@ -4330,16 +4193,6 @@ dependencies = [ "syn 1.0.105", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.23.4" @@ -4800,19 +4653,6 @@ dependencies = [ "windows_x86_64_msvc 0.39.0", ] -[[package]] -name = "windows-sys" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" -dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", -] - [[package]] name = "windows-sys" version = "0.42.0" @@ -4864,12 +4704,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -[[package]] -name = "windows_aarch64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" - [[package]] name = "windows_aarch64_msvc" version = "0.39.0" @@ -4888,12 +4722,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -[[package]] -name = "windows_i686_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" - [[package]] name = "windows_i686_gnu" version = "0.39.0" @@ -4912,12 +4740,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -[[package]] -name = "windows_i686_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" - [[package]] name = "windows_i686_msvc" version = "0.39.0" @@ -4936,12 +4758,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" -[[package]] -name = "windows_x86_64_gnu" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" - [[package]] name = "windows_x86_64_gnu" version = "0.39.0" @@ -4972,12 +4788,6 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -[[package]] -name = "windows_x86_64_msvc" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" - [[package]] name = "windows_x86_64_msvc" version = "0.39.0" diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 9e725af19..72c0072e3 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -24,7 +24,12 @@ clap = { version = "3.2.23", features = ["derive"], optional = true } clap_generate = { version = "3.0.3", optional = true } toml = { version = "0.5.6", features = ["preserve_order"], optional = true } ctrlc = { version = "3.2.2", optional = true } -reqwest = { version = "0.11", features = ["stream", "json"] } +reqwest = { version = "0.11", default-features = false, features = [ + "blocking", + "stream", + "json", + "rustls-tls", +] } tokio = { version = "=1.24", features = ["full"] } futures-util = "0.3.24" flate2 = "1.0.24" From 88f597e90c662427b18a6d20cfbcf3d931b3bb35 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 16 Oct 2023 11:48:16 -0400 Subject: [PATCH 90/99] fix: build error --- Cargo.lock | 8 +------- components/chainhook-cli/Cargo.toml | 8 ++++---- components/chainhook-sdk/Cargo.toml | 8 +++++--- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc1ea2bf0..e5626bc3a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,7 +416,7 @@ dependencies = [ "flume", "futures-util", "hex", - "hiro-system-kit 0.1.0", + "hiro-system-kit 0.3.1", "num_cpus", "rand 0.8.5", "redis", @@ -1607,12 +1607,6 @@ dependencies = [ "atty", "futures", "lazy_static", - "slog", - "slog-async", - "slog-atomic", - "slog-json", - "slog-scope", - "slog-term", "tokio", ] diff --git a/components/chainhook-cli/Cargo.toml b/components/chainhook-cli/Cargo.toml index 72c0072e3..0fa103018 100644 --- a/components/chainhook-cli/Cargo.toml +++ b/components/chainhook-cli/Cargo.toml @@ -17,7 +17,7 @@ hex = "0.4.3" rand = "0.8.5" chainhook-sdk = { version = "0.10.0", default-features = false, features = ["zeromq"], path = "../chainhook-sdk" } clarinet-files = "1.0.1" -hiro-system-kit = "0.1.0" +hiro-system-kit = "0.3.1" # clarinet-files = { path = "../../../clarinet/components/clarinet-files" } # hiro-system-kit = { path = "../../../clarinet/components/hiro-system-kit" } clap = { version = "3.2.23", features = ["derive"], optional = true } @@ -60,9 +60,9 @@ serial_test = "2.0.0" [features] default = ["cli"] -cli = ["clap", "clap_generate", "toml", "ctrlc", "hiro-system-kit/log"] -debug = ["hiro-system-kit/debug"] -release = ["hiro-system-kit/release"] +cli = ["clap", "clap_generate", "toml", "ctrlc", "release"] +debug = ["chainhook-sdk/debug"] +release = ["chainhook-sdk/release"] redis_tests = [] # [patch.crates-io] diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index dc87edd21..d33aef12f 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -14,7 +14,7 @@ serde-hex = "0.1.0" serde_derive = "1" stacks-rpc-client = "1.0.10" clarinet-utils = "1.0.0" -hiro-system-kit = "0.3.1" +hiro-system-kit = { version = "0.3.1", default-features = false, optional = true } # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } @@ -50,6 +50,8 @@ test-case = "3.1.0" "jsonrpc:0.13.0" = { git = 'https://github.com/apoelstra/rust-jsonrpc', rev = "1063671f122a8985c1b7c29030071253da515839" } [features] -default = ["log"] +default = ["hiro-system-kit/log"] zeromq = ["zmq"] -log = ["hiro-system-kit/log"] +debug = ["hiro-system-kit/debug"] +release = ["hiro-system-kit/release"] + From 3c3b4f82558bd40195e006cf5240bda6bf296090 Mon Sep 17 00:00:00 2001 From: MicaiahReid Date: Mon, 16 Oct 2023 11:54:27 -0400 Subject: [PATCH 91/99] chore: update chainhook-sdk version --- Cargo.lock | 2 +- components/chainhook-sdk/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5626bc3a..cba358398 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -439,7 +439,7 @@ dependencies = [ [[package]] name = "chainhook-sdk" -version = "0.10.1" +version = "0.10.2" dependencies = [ "base58 0.2.0", "base64", diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index d33aef12f..86ec59f38 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "chainhook-sdk" -version = "0.10.1" +version = "0.10.2" description = "Stateless Transaction Indexing Engine for Stacks and Bitcoin" license = "GPL-3.0" edition = "2021" From 867424a5c060cdd314d6d35cd27bcea9bd3690be Mon Sep 17 00:00:00 2001 From: MicaiahReid Date: Mon, 16 Oct 2023 15:33:57 -0400 Subject: [PATCH 92/99] fix: enable default features for hiro-system-kit --- components/chainhook-sdk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/chainhook-sdk/Cargo.toml b/components/chainhook-sdk/Cargo.toml index 86ec59f38..b2ce8d009 100644 --- a/components/chainhook-sdk/Cargo.toml +++ b/components/chainhook-sdk/Cargo.toml @@ -14,7 +14,7 @@ serde-hex = "0.1.0" serde_derive = "1" stacks-rpc-client = "1.0.10" clarinet-utils = "1.0.0" -hiro-system-kit = { version = "0.3.1", default-features = false, optional = true } +hiro-system-kit = { version = "0.3.1", optional = true } # stacks-rpc-client = { version = "1", path = "../../../clarinet/components/stacks-rpc-client" } # clarinet-utils = { version = "1", path = "../../../clarinet/components/clarinet-utils" } # hiro-system-kit = { version = "0.1.0", path = "../../../clarinet/components/hiro-system-kit" } From 0de9374cf2ab7b07a5c8b2e93834d96cd73e6011 Mon Sep 17 00:00:00 2001 From: MicaiahReid Date: Mon, 16 Oct 2023 20:51:14 -0400 Subject: [PATCH 93/99] chore: add comment --- components/chainhook-sdk/src/indexer/bitcoin/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs index f46d45527..a90c792dd 100644 --- a/components/chainhook-sdk/src/indexer/bitcoin/mod.rs +++ b/components/chainhook-sdk/src/indexer/bitcoin/mod.rs @@ -229,6 +229,7 @@ pub async fn retrieve_block_hash( Ok(block_hash) } +// not used internally by chainhook; exported for ordhook pub async fn try_download_block_bytes_with_retry( http_client: HttpClient, block_height: u64, From b4ce82f92da49a67a55483a7d4cba283781713e0 Mon Sep 17 00:00:00 2001 From: MicaiahReid Date: Wed, 18 Oct 2023 17:02:27 -0400 Subject: [PATCH 94/99] fix: skip empty chunks when decoding gz --- components/chainhook-cli/src/archive/mod.rs | 69 ++++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/components/chainhook-cli/src/archive/mod.rs b/components/chainhook-cli/src/archive/mod.rs index 6c7715e4a..5a2429556 100644 --- a/components/chainhook-cli/src/archive/mod.rs +++ b/components/chainhook-cli/src/archive/mod.rs @@ -41,48 +41,55 @@ pub async fn download_tsv_file(config: &Config) -> Result<(), String> { // Download chunks let (tx, rx) = flume::bounded(0); - destination_path.push(default_tsv_file_path(&config.network.stacks_network)); - - let decoder_thread = std::thread::spawn(move || { - let input = ChannelRead::new(rx); - let mut decoder = GzDecoder::new(input); - let mut file = fs::File::create(&destination_path).unwrap(); - let mut buffer = [0; 512_000]; - loop { - match decoder.read(&mut buffer) { - Ok(0) => break, - Ok(n) => { - if let Err(e) = file.write_all(&buffer[..n]) { - let err = format!("unable to update compressed archive: {}", e.to_string()); + + if res.status() == reqwest::StatusCode::OK { + destination_path.push(default_tsv_file_path(&config.network.stacks_network)); + + let decoder_thread = std::thread::spawn(move || { + let mut file = fs::File::create(&destination_path).unwrap(); + let input = ChannelRead::new(rx); + let mut decoder = GzDecoder::new(input); + let mut buffer = [0; 512_000]; + loop { + match decoder.read(&mut buffer) { + Ok(0) => break, + Ok(n) => { + if let Err(e) = file.write_all(&buffer[..n]) { + let err = + format!("unable to update compressed archive: {}", e.to_string()); + return Err(err); + } + } + Err(e) => { + let err = format!("unable to write compressed archive: {}", e.to_string()); return Err(err); } } - Err(e) => { - let err = format!("unable to write compressed archive: {}", e.to_string()); - return Err(err); - } } - } - let _ = file.flush(); - Ok(()) - }); - - if res.status() == reqwest::StatusCode::OK { + let _ = file.flush(); + Ok(()) + }); let mut stream = res.bytes_stream(); while let Some(item) = stream.next().await { - let chunk = item.or(Err(format!("Error while downloading file")))?; + let chunk = match item { + Ok(i) => Ok(i), + Err(e) => Err(format!("Error while downloading file {}", e.to_string())), + }?; + if chunk.is_empty() { + continue; + } tx.send_async(chunk.to_vec()) .await - .map_err(|e| format!("unable to download stacks event: {}", e.to_string()))?; + .map_err(|e| format!("unable to download stacks archive: {}", e.to_string()))?; } drop(tx); - } - tokio::task::spawn_blocking(|| decoder_thread.join()) - .await - .unwrap() - .unwrap() - .unwrap(); + tokio::task::spawn_blocking(|| decoder_thread.join()) + .await + .unwrap() + .unwrap() + .unwrap(); + } Ok(()) } From b39c5cce7fac6c47a117621481ffa4a5f5273835 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 23 Oct 2023 11:12:04 -0400 Subject: [PATCH 95/99] Update components/chainhook-cli/src/config/generator.rs Co-authored-by: Micaiah Reid --- components/chainhook-cli/src/config/generator.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/chainhook-cli/src/config/generator.rs b/components/chainhook-cli/src/config/generator.rs index 19a277f2e..2ce72fcbb 100644 --- a/components/chainhook-cli/src/config/generator.rs +++ b/components/chainhook-cli/src/config/generator.rs @@ -39,8 +39,8 @@ max_number_of_processing_threads = 16 max_number_of_networking_threads = 16 max_caching_memory_size_mb = 32000 -# The TSV file is required for downloading historical data for your predicates. If this is not a requirement, you can comment out the `tsv_file_url` line. -# +# The TSV file is required for downloading historical data for your predicates. +# If this is not a requirement, you can comment out the `tsv_file_url` line. [[event_source]] tsv_file_url = "https://archive.hiro.so/{network}/stacks-blockchain-api/{network}-stacks-blockchain-api-latest" "#, From 679d3999d3f0cdbe5f2f925227804d0f40622de7 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 23 Oct 2023 11:15:14 -0400 Subject: [PATCH 96/99] chore: move automate to tests/automation --- {automate => tests/automation}/.env | 0 {automate => tests/automation}/.gitignore | 0 {automate => tests/automation}/Chainhook.toml | 0 {automate => tests/automation}/jest.config.js | 0 {automate => tests/automation}/package-lock.json | 0 {automate => tests/automation}/package.json | 0 {automate => tests/automation}/playwright.config.js | 0 {automate => tests/automation}/readme.md | 0 .../tests/bitcoin-predicates/transaction/transaction-post.json | 0 .../tests/bitcoin-predicates/transaction/transaction.spec.ts | 0 {automate => tests/automation}/tests/mocks/index.ts | 0 .../automation}/tests/selectors/postPage.selectors.ts | 0 {automate => tests/automation}/tests/setup-tests.ts | 0 .../stacks-predicates/block-height/block-height-file-result.json | 0 .../tests/stacks-predicates/block-height/block-height-file.json | 0 .../tests/stacks-predicates/block-height/block-height-post.json | 0 .../tests/stacks-predicates/block-height/block-height.spec.ts | 0 .../contract-call/contract-call-file-result.json | 0 .../tests/stacks-predicates/contract-call/contract-call-file.json | 0 .../tests/stacks-predicates/contract-call/contract-call-post.json | 0 .../tests/stacks-predicates/contract-call/contract-call.spec.ts | 0 .../contract-deployment/contract-deployment-file-result.json | 0 .../contract-deployment/contract-deployment-file.json | 0 .../contract-deployment/contract-deployment-post.json | 0 .../contract-deployment/contract-deployment.spec.ts | 0 .../tests/stacks-predicates/ft-event/ft-event-file-result.json | 0 .../tests/stacks-predicates/ft-event/ft-event-file.json | 0 .../tests/stacks-predicates/ft-event/ft-event-post.json | 0 .../automation}/tests/stacks-predicates/ft-event/ft-event.spec.ts | 0 .../tests/stacks-predicates/nft-event/nft-event-file-result.json | 0 .../tests/stacks-predicates/nft-event/nft-event-file.json | 0 .../tests/stacks-predicates/nft-event/nft-event-post.json | 0 .../tests/stacks-predicates/nft-event/nft-event.spec.ts | 0 .../automation}/tests/stacks-predicates/predicate-commands.json | 0 .../stacks-predicates/print-event/print-event-file-result.json | 0 .../tests/stacks-predicates/print-event/print-event-file.json | 0 .../tests/stacks-predicates/print-event/print-event-post.json | 0 .../tests/stacks-predicates/print-event/print-event.spec.ts | 0 .../tests/stacks-predicates/stx-event/stx-event-file-result.json | 0 .../tests/stacks-predicates/stx-event/stx-event-file.json | 0 .../tests/stacks-predicates/stx-event/stx-event-post.json | 0 .../tests/stacks-predicates/stx-event/stx-event.spec.ts | 0 .../stacks-predicates/transaction/transaction-file-result.json | 0 .../tests/stacks-predicates/transaction/transaction-file.json | 0 .../tests/stacks-predicates/transaction/transaction-post.json | 0 .../tests/stacks-predicates/transaction/transaction.spec.ts | 0 {automate => tests/automation}/tests/tsconfig.json | 0 {automate => tests/automation}/tests/utility/browser-instance.ts | 0 .../automation}/tests/utility/post-page-instance.ts | 0 {automate => tests/automation}/tests/utility/utils.ts | 0 {automate => tests/automation}/tsconfig.json | 0 51 files changed, 0 insertions(+), 0 deletions(-) rename {automate => tests/automation}/.env (100%) rename {automate => tests/automation}/.gitignore (100%) rename {automate => tests/automation}/Chainhook.toml (100%) rename {automate => tests/automation}/jest.config.js (100%) rename {automate => tests/automation}/package-lock.json (100%) rename {automate => tests/automation}/package.json (100%) rename {automate => tests/automation}/playwright.config.js (100%) rename {automate => tests/automation}/readme.md (100%) rename {automate => tests/automation}/tests/bitcoin-predicates/transaction/transaction-post.json (100%) rename {automate => tests/automation}/tests/bitcoin-predicates/transaction/transaction.spec.ts (100%) rename {automate => tests/automation}/tests/mocks/index.ts (100%) rename {automate => tests/automation}/tests/selectors/postPage.selectors.ts (100%) rename {automate => tests/automation}/tests/setup-tests.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/block-height/block-height-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/block-height/block-height-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/block-height/block-height-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/block-height/block-height.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-call/contract-call-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-call/contract-call-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-call/contract-call-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-call/contract-call.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-deployment/contract-deployment-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-deployment/contract-deployment-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/ft-event/ft-event-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/ft-event/ft-event-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/ft-event/ft-event-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/ft-event/ft-event.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/nft-event/nft-event-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/nft-event/nft-event-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/nft-event/nft-event-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/nft-event/nft-event.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/predicate-commands.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/print-event/print-event-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/print-event/print-event-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/print-event/print-event-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/print-event/print-event.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/stx-event/stx-event-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/stx-event/stx-event-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/stx-event/stx-event-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/stx-event/stx-event.spec.ts (100%) rename {automate => tests/automation}/tests/stacks-predicates/transaction/transaction-file-result.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/transaction/transaction-file.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/transaction/transaction-post.json (100%) rename {automate => tests/automation}/tests/stacks-predicates/transaction/transaction.spec.ts (100%) rename {automate => tests/automation}/tests/tsconfig.json (100%) rename {automate => tests/automation}/tests/utility/browser-instance.ts (100%) rename {automate => tests/automation}/tests/utility/post-page-instance.ts (100%) rename {automate => tests/automation}/tests/utility/utils.ts (100%) rename {automate => tests/automation}/tsconfig.json (100%) diff --git a/automate/.env b/tests/automation/.env similarity index 100% rename from automate/.env rename to tests/automation/.env diff --git a/automate/.gitignore b/tests/automation/.gitignore similarity index 100% rename from automate/.gitignore rename to tests/automation/.gitignore diff --git a/automate/Chainhook.toml b/tests/automation/Chainhook.toml similarity index 100% rename from automate/Chainhook.toml rename to tests/automation/Chainhook.toml diff --git a/automate/jest.config.js b/tests/automation/jest.config.js similarity index 100% rename from automate/jest.config.js rename to tests/automation/jest.config.js diff --git a/automate/package-lock.json b/tests/automation/package-lock.json similarity index 100% rename from automate/package-lock.json rename to tests/automation/package-lock.json diff --git a/automate/package.json b/tests/automation/package.json similarity index 100% rename from automate/package.json rename to tests/automation/package.json diff --git a/automate/playwright.config.js b/tests/automation/playwright.config.js similarity index 100% rename from automate/playwright.config.js rename to tests/automation/playwright.config.js diff --git a/automate/readme.md b/tests/automation/readme.md similarity index 100% rename from automate/readme.md rename to tests/automation/readme.md diff --git a/automate/tests/bitcoin-predicates/transaction/transaction-post.json b/tests/automation/tests/bitcoin-predicates/transaction/transaction-post.json similarity index 100% rename from automate/tests/bitcoin-predicates/transaction/transaction-post.json rename to tests/automation/tests/bitcoin-predicates/transaction/transaction-post.json diff --git a/automate/tests/bitcoin-predicates/transaction/transaction.spec.ts b/tests/automation/tests/bitcoin-predicates/transaction/transaction.spec.ts similarity index 100% rename from automate/tests/bitcoin-predicates/transaction/transaction.spec.ts rename to tests/automation/tests/bitcoin-predicates/transaction/transaction.spec.ts diff --git a/automate/tests/mocks/index.ts b/tests/automation/tests/mocks/index.ts similarity index 100% rename from automate/tests/mocks/index.ts rename to tests/automation/tests/mocks/index.ts diff --git a/automate/tests/selectors/postPage.selectors.ts b/tests/automation/tests/selectors/postPage.selectors.ts similarity index 100% rename from automate/tests/selectors/postPage.selectors.ts rename to tests/automation/tests/selectors/postPage.selectors.ts diff --git a/automate/tests/setup-tests.ts b/tests/automation/tests/setup-tests.ts similarity index 100% rename from automate/tests/setup-tests.ts rename to tests/automation/tests/setup-tests.ts diff --git a/automate/tests/stacks-predicates/block-height/block-height-file-result.json b/tests/automation/tests/stacks-predicates/block-height/block-height-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/block-height/block-height-file-result.json rename to tests/automation/tests/stacks-predicates/block-height/block-height-file-result.json diff --git a/automate/tests/stacks-predicates/block-height/block-height-file.json b/tests/automation/tests/stacks-predicates/block-height/block-height-file.json similarity index 100% rename from automate/tests/stacks-predicates/block-height/block-height-file.json rename to tests/automation/tests/stacks-predicates/block-height/block-height-file.json diff --git a/automate/tests/stacks-predicates/block-height/block-height-post.json b/tests/automation/tests/stacks-predicates/block-height/block-height-post.json similarity index 100% rename from automate/tests/stacks-predicates/block-height/block-height-post.json rename to tests/automation/tests/stacks-predicates/block-height/block-height-post.json diff --git a/automate/tests/stacks-predicates/block-height/block-height.spec.ts b/tests/automation/tests/stacks-predicates/block-height/block-height.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/block-height/block-height.spec.ts rename to tests/automation/tests/stacks-predicates/block-height/block-height.spec.ts diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-file-result.json b/tests/automation/tests/stacks-predicates/contract-call/contract-call-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/contract-call/contract-call-file-result.json rename to tests/automation/tests/stacks-predicates/contract-call/contract-call-file-result.json diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-file.json b/tests/automation/tests/stacks-predicates/contract-call/contract-call-file.json similarity index 100% rename from automate/tests/stacks-predicates/contract-call/contract-call-file.json rename to tests/automation/tests/stacks-predicates/contract-call/contract-call-file.json diff --git a/automate/tests/stacks-predicates/contract-call/contract-call-post.json b/tests/automation/tests/stacks-predicates/contract-call/contract-call-post.json similarity index 100% rename from automate/tests/stacks-predicates/contract-call/contract-call-post.json rename to tests/automation/tests/stacks-predicates/contract-call/contract-call-post.json diff --git a/automate/tests/stacks-predicates/contract-call/contract-call.spec.ts b/tests/automation/tests/stacks-predicates/contract-call/contract-call.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/contract-call/contract-call.spec.ts rename to tests/automation/tests/stacks-predicates/contract-call/contract-call.spec.ts diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json b/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json rename to tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment-file.json b/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file.json similarity index 100% rename from automate/tests/stacks-predicates/contract-deployment/contract-deployment-file.json rename to tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file.json diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json b/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-post.json similarity index 100% rename from automate/tests/stacks-predicates/contract-deployment/contract-deployment-post.json rename to tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-post.json diff --git a/automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts b/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts rename to tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts diff --git a/automate/tests/stacks-predicates/ft-event/ft-event-file-result.json b/tests/automation/tests/stacks-predicates/ft-event/ft-event-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/ft-event/ft-event-file-result.json rename to tests/automation/tests/stacks-predicates/ft-event/ft-event-file-result.json diff --git a/automate/tests/stacks-predicates/ft-event/ft-event-file.json b/tests/automation/tests/stacks-predicates/ft-event/ft-event-file.json similarity index 100% rename from automate/tests/stacks-predicates/ft-event/ft-event-file.json rename to tests/automation/tests/stacks-predicates/ft-event/ft-event-file.json diff --git a/automate/tests/stacks-predicates/ft-event/ft-event-post.json b/tests/automation/tests/stacks-predicates/ft-event/ft-event-post.json similarity index 100% rename from automate/tests/stacks-predicates/ft-event/ft-event-post.json rename to tests/automation/tests/stacks-predicates/ft-event/ft-event-post.json diff --git a/automate/tests/stacks-predicates/ft-event/ft-event.spec.ts b/tests/automation/tests/stacks-predicates/ft-event/ft-event.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/ft-event/ft-event.spec.ts rename to tests/automation/tests/stacks-predicates/ft-event/ft-event.spec.ts diff --git a/automate/tests/stacks-predicates/nft-event/nft-event-file-result.json b/tests/automation/tests/stacks-predicates/nft-event/nft-event-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/nft-event/nft-event-file-result.json rename to tests/automation/tests/stacks-predicates/nft-event/nft-event-file-result.json diff --git a/automate/tests/stacks-predicates/nft-event/nft-event-file.json b/tests/automation/tests/stacks-predicates/nft-event/nft-event-file.json similarity index 100% rename from automate/tests/stacks-predicates/nft-event/nft-event-file.json rename to tests/automation/tests/stacks-predicates/nft-event/nft-event-file.json diff --git a/automate/tests/stacks-predicates/nft-event/nft-event-post.json b/tests/automation/tests/stacks-predicates/nft-event/nft-event-post.json similarity index 100% rename from automate/tests/stacks-predicates/nft-event/nft-event-post.json rename to tests/automation/tests/stacks-predicates/nft-event/nft-event-post.json diff --git a/automate/tests/stacks-predicates/nft-event/nft-event.spec.ts b/tests/automation/tests/stacks-predicates/nft-event/nft-event.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/nft-event/nft-event.spec.ts rename to tests/automation/tests/stacks-predicates/nft-event/nft-event.spec.ts diff --git a/automate/tests/stacks-predicates/predicate-commands.json b/tests/automation/tests/stacks-predicates/predicate-commands.json similarity index 100% rename from automate/tests/stacks-predicates/predicate-commands.json rename to tests/automation/tests/stacks-predicates/predicate-commands.json diff --git a/automate/tests/stacks-predicates/print-event/print-event-file-result.json b/tests/automation/tests/stacks-predicates/print-event/print-event-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/print-event/print-event-file-result.json rename to tests/automation/tests/stacks-predicates/print-event/print-event-file-result.json diff --git a/automate/tests/stacks-predicates/print-event/print-event-file.json b/tests/automation/tests/stacks-predicates/print-event/print-event-file.json similarity index 100% rename from automate/tests/stacks-predicates/print-event/print-event-file.json rename to tests/automation/tests/stacks-predicates/print-event/print-event-file.json diff --git a/automate/tests/stacks-predicates/print-event/print-event-post.json b/tests/automation/tests/stacks-predicates/print-event/print-event-post.json similarity index 100% rename from automate/tests/stacks-predicates/print-event/print-event-post.json rename to tests/automation/tests/stacks-predicates/print-event/print-event-post.json diff --git a/automate/tests/stacks-predicates/print-event/print-event.spec.ts b/tests/automation/tests/stacks-predicates/print-event/print-event.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/print-event/print-event.spec.ts rename to tests/automation/tests/stacks-predicates/print-event/print-event.spec.ts diff --git a/automate/tests/stacks-predicates/stx-event/stx-event-file-result.json b/tests/automation/tests/stacks-predicates/stx-event/stx-event-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/stx-event/stx-event-file-result.json rename to tests/automation/tests/stacks-predicates/stx-event/stx-event-file-result.json diff --git a/automate/tests/stacks-predicates/stx-event/stx-event-file.json b/tests/automation/tests/stacks-predicates/stx-event/stx-event-file.json similarity index 100% rename from automate/tests/stacks-predicates/stx-event/stx-event-file.json rename to tests/automation/tests/stacks-predicates/stx-event/stx-event-file.json diff --git a/automate/tests/stacks-predicates/stx-event/stx-event-post.json b/tests/automation/tests/stacks-predicates/stx-event/stx-event-post.json similarity index 100% rename from automate/tests/stacks-predicates/stx-event/stx-event-post.json rename to tests/automation/tests/stacks-predicates/stx-event/stx-event-post.json diff --git a/automate/tests/stacks-predicates/stx-event/stx-event.spec.ts b/tests/automation/tests/stacks-predicates/stx-event/stx-event.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/stx-event/stx-event.spec.ts rename to tests/automation/tests/stacks-predicates/stx-event/stx-event.spec.ts diff --git a/automate/tests/stacks-predicates/transaction/transaction-file-result.json b/tests/automation/tests/stacks-predicates/transaction/transaction-file-result.json similarity index 100% rename from automate/tests/stacks-predicates/transaction/transaction-file-result.json rename to tests/automation/tests/stacks-predicates/transaction/transaction-file-result.json diff --git a/automate/tests/stacks-predicates/transaction/transaction-file.json b/tests/automation/tests/stacks-predicates/transaction/transaction-file.json similarity index 100% rename from automate/tests/stacks-predicates/transaction/transaction-file.json rename to tests/automation/tests/stacks-predicates/transaction/transaction-file.json diff --git a/automate/tests/stacks-predicates/transaction/transaction-post.json b/tests/automation/tests/stacks-predicates/transaction/transaction-post.json similarity index 100% rename from automate/tests/stacks-predicates/transaction/transaction-post.json rename to tests/automation/tests/stacks-predicates/transaction/transaction-post.json diff --git a/automate/tests/stacks-predicates/transaction/transaction.spec.ts b/tests/automation/tests/stacks-predicates/transaction/transaction.spec.ts similarity index 100% rename from automate/tests/stacks-predicates/transaction/transaction.spec.ts rename to tests/automation/tests/stacks-predicates/transaction/transaction.spec.ts diff --git a/automate/tests/tsconfig.json b/tests/automation/tests/tsconfig.json similarity index 100% rename from automate/tests/tsconfig.json rename to tests/automation/tests/tsconfig.json diff --git a/automate/tests/utility/browser-instance.ts b/tests/automation/tests/utility/browser-instance.ts similarity index 100% rename from automate/tests/utility/browser-instance.ts rename to tests/automation/tests/utility/browser-instance.ts diff --git a/automate/tests/utility/post-page-instance.ts b/tests/automation/tests/utility/post-page-instance.ts similarity index 100% rename from automate/tests/utility/post-page-instance.ts rename to tests/automation/tests/utility/post-page-instance.ts diff --git a/automate/tests/utility/utils.ts b/tests/automation/tests/utility/utils.ts similarity index 100% rename from automate/tests/utility/utils.ts rename to tests/automation/tests/utility/utils.ts diff --git a/automate/tsconfig.json b/tests/automation/tsconfig.json similarity index 100% rename from automate/tsconfig.json rename to tests/automation/tsconfig.json From c92eac74d7386f75203ded5bd44c95a3d0acbfd0 Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 23 Oct 2023 11:49:50 -0400 Subject: [PATCH 97/99] chore: update secp256k1-sys --- Cargo.lock | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 2137eb5e2..3340d1bbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3348,6 +3348,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "semver" version = "0.9.0" From 53b228fafd5c134b887182868c233267a5ca5e2e Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 23 Oct 2023 12:58:49 -0400 Subject: [PATCH 98/99] chore: update openapi doc --- docs/chainhook-openapi.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/chainhook-openapi.json b/docs/chainhook-openapi.json index 0960d2686..2ba909c65 100644 --- a/docs/chainhook-openapi.json +++ b/docs/chainhook-openapi.json @@ -521,6 +521,18 @@ } }, "additionalProperties": false + }, + { + "type": "object", + "required": [ + "descriptor" + ], + "properties": { + "descriptor": { + "$ref": "#/components/schemas/DescriptorMatchingRule" + } + }, + "additionalProperties": false } ], "required": [ @@ -726,6 +738,29 @@ } ] }, + "DescriptorMatchingRule": { + "type": "object", + "required": [ + "expression" + ], + "properties": { + "expression": { + "type": "string" + }, + "range": { + "default": null, + "type": "array", + "items": { + "type": "integer", + "format": "uint32", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2, + "nullable": true + } + } + }, "HookAction": { "oneOf": [ { From 3932b83e4fdeb318c166844f4c59213a694698ff Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Mon, 23 Oct 2023 14:02:31 -0400 Subject: [PATCH 99/99] chore: rename automate to integration-tests --- tests/{automation => integration-tests}/.env | 0 tests/{automation => integration-tests}/.gitignore | 0 tests/{automation => integration-tests}/Chainhook.toml | 0 tests/{automation => integration-tests}/jest.config.js | 0 tests/{automation => integration-tests}/package-lock.json | 0 tests/{automation => integration-tests}/package.json | 0 tests/{automation => integration-tests}/playwright.config.js | 0 tests/{automation => integration-tests}/readme.md | 0 .../tests/bitcoin-predicates/transaction/transaction-post.json | 0 .../tests/bitcoin-predicates/transaction/transaction.spec.ts | 0 tests/{automation => integration-tests}/tests/mocks/index.ts | 0 .../tests/selectors/postPage.selectors.ts | 0 tests/{automation => integration-tests}/tests/setup-tests.ts | 0 .../stacks-predicates/block-height/block-height-file-result.json | 0 .../tests/stacks-predicates/block-height/block-height-file.json | 0 .../tests/stacks-predicates/block-height/block-height-post.json | 0 .../tests/stacks-predicates/block-height/block-height.spec.ts | 0 .../contract-call/contract-call-file-result.json | 0 .../tests/stacks-predicates/contract-call/contract-call-file.json | 0 .../tests/stacks-predicates/contract-call/contract-call-post.json | 0 .../tests/stacks-predicates/contract-call/contract-call.spec.ts | 0 .../contract-deployment/contract-deployment-file-result.json | 0 .../contract-deployment/contract-deployment-file.json | 0 .../contract-deployment/contract-deployment-post.json | 0 .../contract-deployment/contract-deployment.spec.ts | 0 .../tests/stacks-predicates/ft-event/ft-event-file-result.json | 0 .../tests/stacks-predicates/ft-event/ft-event-file.json | 0 .../tests/stacks-predicates/ft-event/ft-event-post.json | 0 .../tests/stacks-predicates/ft-event/ft-event.spec.ts | 0 .../tests/stacks-predicates/nft-event/nft-event-file-result.json | 0 .../tests/stacks-predicates/nft-event/nft-event-file.json | 0 .../tests/stacks-predicates/nft-event/nft-event-post.json | 0 .../tests/stacks-predicates/nft-event/nft-event.spec.ts | 0 .../tests/stacks-predicates/predicate-commands.json | 0 .../stacks-predicates/print-event/print-event-file-result.json | 0 .../tests/stacks-predicates/print-event/print-event-file.json | 0 .../tests/stacks-predicates/print-event/print-event-post.json | 0 .../tests/stacks-predicates/print-event/print-event.spec.ts | 0 .../tests/stacks-predicates/stx-event/stx-event-file-result.json | 0 .../tests/stacks-predicates/stx-event/stx-event-file.json | 0 .../tests/stacks-predicates/stx-event/stx-event-post.json | 0 .../tests/stacks-predicates/stx-event/stx-event.spec.ts | 0 .../stacks-predicates/transaction/transaction-file-result.json | 0 .../tests/stacks-predicates/transaction/transaction-file.json | 0 .../tests/stacks-predicates/transaction/transaction-post.json | 0 .../tests/stacks-predicates/transaction/transaction.spec.ts | 0 tests/{automation => integration-tests}/tests/tsconfig.json | 0 .../tests/utility/browser-instance.ts | 0 .../tests/utility/post-page-instance.ts | 0 tests/{automation => integration-tests}/tests/utility/utils.ts | 0 tests/{automation => integration-tests}/tsconfig.json | 0 51 files changed, 0 insertions(+), 0 deletions(-) rename tests/{automation => integration-tests}/.env (100%) rename tests/{automation => integration-tests}/.gitignore (100%) rename tests/{automation => integration-tests}/Chainhook.toml (100%) rename tests/{automation => integration-tests}/jest.config.js (100%) rename tests/{automation => integration-tests}/package-lock.json (100%) rename tests/{automation => integration-tests}/package.json (100%) rename tests/{automation => integration-tests}/playwright.config.js (100%) rename tests/{automation => integration-tests}/readme.md (100%) rename tests/{automation => integration-tests}/tests/bitcoin-predicates/transaction/transaction-post.json (100%) rename tests/{automation => integration-tests}/tests/bitcoin-predicates/transaction/transaction.spec.ts (100%) rename tests/{automation => integration-tests}/tests/mocks/index.ts (100%) rename tests/{automation => integration-tests}/tests/selectors/postPage.selectors.ts (100%) rename tests/{automation => integration-tests}/tests/setup-tests.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/block-height/block-height-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/block-height/block-height-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/block-height/block-height-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/block-height/block-height.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-call/contract-call-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-call/contract-call-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-call/contract-call-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-call/contract-call.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-deployment/contract-deployment-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-deployment/contract-deployment-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/ft-event/ft-event-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/ft-event/ft-event-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/ft-event/ft-event-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/ft-event/ft-event.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/nft-event/nft-event-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/nft-event/nft-event-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/nft-event/nft-event-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/nft-event/nft-event.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/predicate-commands.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/print-event/print-event-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/print-event/print-event-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/print-event/print-event-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/print-event/print-event.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/stx-event/stx-event-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/stx-event/stx-event-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/stx-event/stx-event-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/stx-event/stx-event.spec.ts (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/transaction/transaction-file-result.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/transaction/transaction-file.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/transaction/transaction-post.json (100%) rename tests/{automation => integration-tests}/tests/stacks-predicates/transaction/transaction.spec.ts (100%) rename tests/{automation => integration-tests}/tests/tsconfig.json (100%) rename tests/{automation => integration-tests}/tests/utility/browser-instance.ts (100%) rename tests/{automation => integration-tests}/tests/utility/post-page-instance.ts (100%) rename tests/{automation => integration-tests}/tests/utility/utils.ts (100%) rename tests/{automation => integration-tests}/tsconfig.json (100%) diff --git a/tests/automation/.env b/tests/integration-tests/.env similarity index 100% rename from tests/automation/.env rename to tests/integration-tests/.env diff --git a/tests/automation/.gitignore b/tests/integration-tests/.gitignore similarity index 100% rename from tests/automation/.gitignore rename to tests/integration-tests/.gitignore diff --git a/tests/automation/Chainhook.toml b/tests/integration-tests/Chainhook.toml similarity index 100% rename from tests/automation/Chainhook.toml rename to tests/integration-tests/Chainhook.toml diff --git a/tests/automation/jest.config.js b/tests/integration-tests/jest.config.js similarity index 100% rename from tests/automation/jest.config.js rename to tests/integration-tests/jest.config.js diff --git a/tests/automation/package-lock.json b/tests/integration-tests/package-lock.json similarity index 100% rename from tests/automation/package-lock.json rename to tests/integration-tests/package-lock.json diff --git a/tests/automation/package.json b/tests/integration-tests/package.json similarity index 100% rename from tests/automation/package.json rename to tests/integration-tests/package.json diff --git a/tests/automation/playwright.config.js b/tests/integration-tests/playwright.config.js similarity index 100% rename from tests/automation/playwright.config.js rename to tests/integration-tests/playwright.config.js diff --git a/tests/automation/readme.md b/tests/integration-tests/readme.md similarity index 100% rename from tests/automation/readme.md rename to tests/integration-tests/readme.md diff --git a/tests/automation/tests/bitcoin-predicates/transaction/transaction-post.json b/tests/integration-tests/tests/bitcoin-predicates/transaction/transaction-post.json similarity index 100% rename from tests/automation/tests/bitcoin-predicates/transaction/transaction-post.json rename to tests/integration-tests/tests/bitcoin-predicates/transaction/transaction-post.json diff --git a/tests/automation/tests/bitcoin-predicates/transaction/transaction.spec.ts b/tests/integration-tests/tests/bitcoin-predicates/transaction/transaction.spec.ts similarity index 100% rename from tests/automation/tests/bitcoin-predicates/transaction/transaction.spec.ts rename to tests/integration-tests/tests/bitcoin-predicates/transaction/transaction.spec.ts diff --git a/tests/automation/tests/mocks/index.ts b/tests/integration-tests/tests/mocks/index.ts similarity index 100% rename from tests/automation/tests/mocks/index.ts rename to tests/integration-tests/tests/mocks/index.ts diff --git a/tests/automation/tests/selectors/postPage.selectors.ts b/tests/integration-tests/tests/selectors/postPage.selectors.ts similarity index 100% rename from tests/automation/tests/selectors/postPage.selectors.ts rename to tests/integration-tests/tests/selectors/postPage.selectors.ts diff --git a/tests/automation/tests/setup-tests.ts b/tests/integration-tests/tests/setup-tests.ts similarity index 100% rename from tests/automation/tests/setup-tests.ts rename to tests/integration-tests/tests/setup-tests.ts diff --git a/tests/automation/tests/stacks-predicates/block-height/block-height-file-result.json b/tests/integration-tests/tests/stacks-predicates/block-height/block-height-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/block-height/block-height-file-result.json rename to tests/integration-tests/tests/stacks-predicates/block-height/block-height-file-result.json diff --git a/tests/automation/tests/stacks-predicates/block-height/block-height-file.json b/tests/integration-tests/tests/stacks-predicates/block-height/block-height-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/block-height/block-height-file.json rename to tests/integration-tests/tests/stacks-predicates/block-height/block-height-file.json diff --git a/tests/automation/tests/stacks-predicates/block-height/block-height-post.json b/tests/integration-tests/tests/stacks-predicates/block-height/block-height-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/block-height/block-height-post.json rename to tests/integration-tests/tests/stacks-predicates/block-height/block-height-post.json diff --git a/tests/automation/tests/stacks-predicates/block-height/block-height.spec.ts b/tests/integration-tests/tests/stacks-predicates/block-height/block-height.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/block-height/block-height.spec.ts rename to tests/integration-tests/tests/stacks-predicates/block-height/block-height.spec.ts diff --git a/tests/automation/tests/stacks-predicates/contract-call/contract-call-file-result.json b/tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-call/contract-call-file-result.json rename to tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-file-result.json diff --git a/tests/automation/tests/stacks-predicates/contract-call/contract-call-file.json b/tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-call/contract-call-file.json rename to tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-file.json diff --git a/tests/automation/tests/stacks-predicates/contract-call/contract-call-post.json b/tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-call/contract-call-post.json rename to tests/integration-tests/tests/stacks-predicates/contract-call/contract-call-post.json diff --git a/tests/automation/tests/stacks-predicates/contract-call/contract-call.spec.ts b/tests/integration-tests/tests/stacks-predicates/contract-call/contract-call.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-call/contract-call.spec.ts rename to tests/integration-tests/tests/stacks-predicates/contract-call/contract-call.spec.ts diff --git a/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json b/tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json rename to tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-file-result.json diff --git a/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file.json b/tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-file.json rename to tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-file.json diff --git a/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-post.json b/tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment-post.json rename to tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment-post.json diff --git a/tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts b/tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts rename to tests/integration-tests/tests/stacks-predicates/contract-deployment/contract-deployment.spec.ts diff --git a/tests/automation/tests/stacks-predicates/ft-event/ft-event-file-result.json b/tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/ft-event/ft-event-file-result.json rename to tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-file-result.json diff --git a/tests/automation/tests/stacks-predicates/ft-event/ft-event-file.json b/tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/ft-event/ft-event-file.json rename to tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-file.json diff --git a/tests/automation/tests/stacks-predicates/ft-event/ft-event-post.json b/tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/ft-event/ft-event-post.json rename to tests/integration-tests/tests/stacks-predicates/ft-event/ft-event-post.json diff --git a/tests/automation/tests/stacks-predicates/ft-event/ft-event.spec.ts b/tests/integration-tests/tests/stacks-predicates/ft-event/ft-event.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/ft-event/ft-event.spec.ts rename to tests/integration-tests/tests/stacks-predicates/ft-event/ft-event.spec.ts diff --git a/tests/automation/tests/stacks-predicates/nft-event/nft-event-file-result.json b/tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/nft-event/nft-event-file-result.json rename to tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-file-result.json diff --git a/tests/automation/tests/stacks-predicates/nft-event/nft-event-file.json b/tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/nft-event/nft-event-file.json rename to tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-file.json diff --git a/tests/automation/tests/stacks-predicates/nft-event/nft-event-post.json b/tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/nft-event/nft-event-post.json rename to tests/integration-tests/tests/stacks-predicates/nft-event/nft-event-post.json diff --git a/tests/automation/tests/stacks-predicates/nft-event/nft-event.spec.ts b/tests/integration-tests/tests/stacks-predicates/nft-event/nft-event.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/nft-event/nft-event.spec.ts rename to tests/integration-tests/tests/stacks-predicates/nft-event/nft-event.spec.ts diff --git a/tests/automation/tests/stacks-predicates/predicate-commands.json b/tests/integration-tests/tests/stacks-predicates/predicate-commands.json similarity index 100% rename from tests/automation/tests/stacks-predicates/predicate-commands.json rename to tests/integration-tests/tests/stacks-predicates/predicate-commands.json diff --git a/tests/automation/tests/stacks-predicates/print-event/print-event-file-result.json b/tests/integration-tests/tests/stacks-predicates/print-event/print-event-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/print-event/print-event-file-result.json rename to tests/integration-tests/tests/stacks-predicates/print-event/print-event-file-result.json diff --git a/tests/automation/tests/stacks-predicates/print-event/print-event-file.json b/tests/integration-tests/tests/stacks-predicates/print-event/print-event-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/print-event/print-event-file.json rename to tests/integration-tests/tests/stacks-predicates/print-event/print-event-file.json diff --git a/tests/automation/tests/stacks-predicates/print-event/print-event-post.json b/tests/integration-tests/tests/stacks-predicates/print-event/print-event-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/print-event/print-event-post.json rename to tests/integration-tests/tests/stacks-predicates/print-event/print-event-post.json diff --git a/tests/automation/tests/stacks-predicates/print-event/print-event.spec.ts b/tests/integration-tests/tests/stacks-predicates/print-event/print-event.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/print-event/print-event.spec.ts rename to tests/integration-tests/tests/stacks-predicates/print-event/print-event.spec.ts diff --git a/tests/automation/tests/stacks-predicates/stx-event/stx-event-file-result.json b/tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/stx-event/stx-event-file-result.json rename to tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-file-result.json diff --git a/tests/automation/tests/stacks-predicates/stx-event/stx-event-file.json b/tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/stx-event/stx-event-file.json rename to tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-file.json diff --git a/tests/automation/tests/stacks-predicates/stx-event/stx-event-post.json b/tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/stx-event/stx-event-post.json rename to tests/integration-tests/tests/stacks-predicates/stx-event/stx-event-post.json diff --git a/tests/automation/tests/stacks-predicates/stx-event/stx-event.spec.ts b/tests/integration-tests/tests/stacks-predicates/stx-event/stx-event.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/stx-event/stx-event.spec.ts rename to tests/integration-tests/tests/stacks-predicates/stx-event/stx-event.spec.ts diff --git a/tests/automation/tests/stacks-predicates/transaction/transaction-file-result.json b/tests/integration-tests/tests/stacks-predicates/transaction/transaction-file-result.json similarity index 100% rename from tests/automation/tests/stacks-predicates/transaction/transaction-file-result.json rename to tests/integration-tests/tests/stacks-predicates/transaction/transaction-file-result.json diff --git a/tests/automation/tests/stacks-predicates/transaction/transaction-file.json b/tests/integration-tests/tests/stacks-predicates/transaction/transaction-file.json similarity index 100% rename from tests/automation/tests/stacks-predicates/transaction/transaction-file.json rename to tests/integration-tests/tests/stacks-predicates/transaction/transaction-file.json diff --git a/tests/automation/tests/stacks-predicates/transaction/transaction-post.json b/tests/integration-tests/tests/stacks-predicates/transaction/transaction-post.json similarity index 100% rename from tests/automation/tests/stacks-predicates/transaction/transaction-post.json rename to tests/integration-tests/tests/stacks-predicates/transaction/transaction-post.json diff --git a/tests/automation/tests/stacks-predicates/transaction/transaction.spec.ts b/tests/integration-tests/tests/stacks-predicates/transaction/transaction.spec.ts similarity index 100% rename from tests/automation/tests/stacks-predicates/transaction/transaction.spec.ts rename to tests/integration-tests/tests/stacks-predicates/transaction/transaction.spec.ts diff --git a/tests/automation/tests/tsconfig.json b/tests/integration-tests/tests/tsconfig.json similarity index 100% rename from tests/automation/tests/tsconfig.json rename to tests/integration-tests/tests/tsconfig.json diff --git a/tests/automation/tests/utility/browser-instance.ts b/tests/integration-tests/tests/utility/browser-instance.ts similarity index 100% rename from tests/automation/tests/utility/browser-instance.ts rename to tests/integration-tests/tests/utility/browser-instance.ts diff --git a/tests/automation/tests/utility/post-page-instance.ts b/tests/integration-tests/tests/utility/post-page-instance.ts similarity index 100% rename from tests/automation/tests/utility/post-page-instance.ts rename to tests/integration-tests/tests/utility/post-page-instance.ts diff --git a/tests/automation/tests/utility/utils.ts b/tests/integration-tests/tests/utility/utils.ts similarity index 100% rename from tests/automation/tests/utility/utils.ts rename to tests/integration-tests/tests/utility/utils.ts diff --git a/tests/automation/tsconfig.json b/tests/integration-tests/tsconfig.json similarity index 100% rename from tests/automation/tsconfig.json rename to tests/integration-tests/tsconfig.json